Yii Framework - yes it is rapid web application development (Parte 1)
1. Yii Framework
Yes it is rapid web application development (parte 1)
Bruno Rossi (brunorossiweb@gmail.com)
Senior Web Developer
PHP 5.0 Zend Certified Engineer
Sun MySQL5.0 Certified Developer
PHP User Group Pavia - http://pavia.grusp.org
2. Vi presento Yii
● framework PHP per lo sviluppo rapido di applicazioni web
● software libero rilasciato sotto licenza BSD da YiiSoft
● è basato su programmazione ad oggetti e sul design pattern Model View
Controller
● necessita di PHP 5.1 o superiori
● è chiaramente ed ampiamente documentato
● apprendere Yii è facile per chi ha esperienza di programmazione ad oggetti o
ha esperienza con altri framework MVC
● permette l'autogenerazione di codice
● è figlio di PRADO ed è stato rilasciato a fine 2008 dal fondatore Qiang Xue
● utilizza JQuery al fine di fornire funzionalità e interfacce utente Web 2.0
Pagina 2 di 35 Bruno Rossi - PHP User Group Pavia - 29/09/2012
3. Componenti
● Yii è basato su oggetti denominati componenti che assolvono a compiti
specifici
● tutti i componenti estendono la classe CComponent o classi derivate
● i componenti presentano proprietà di tipo evento alle quali possono essere
assegnati dei gestori (event handler)
$component->onClicked = $callback
● i componenti possono essere associati a più oggetti comportamento (behavior),
un oggetto comportamento può essere associato a più componenti, in tal modo
si ottiene una ereditarietà multipla via Mixin Pattern
$component->attachBehavior($name, $behavior);
$component->test()
Pagina 3 di 35 Bruno Rossi - PHP User Group Pavia - 29/09/2012
4. Yii, componenti principali
● CAssetManager pubblicazione dei file asset (javascript, CSS, immagini)
http://www.yiiframework.com/doc/api/1.1/CAssetManager
● CAuthManager controllo degli accessi basato sui ruoli
http://www.yiiframework.com/doc/api/1.1/CAuthManager
● CCache gestione caching (CMemCache, CDbCache, CApcCache,
CEAcceleratorCache, CFileCache, CWinCache, CXCache, CZendDataCache)
http://www.yiiframework.com/doc/api/1.1/CCache
● CDbConnection Data Access Object (DAO) basato su PHP Data Object
(PDO). Permette di gestire differenti tipi di database mediante un'interfaccia
comune (SQLite, MySql, PostgreSQL, SQL Server, Oracle). Query Builder
(CDbCommand) permette di eseguire interrogazioni mediante SQL e prevenire
SQL injection. Supporta Active Record design pattern (CActiveRecord). Una
classe CActiveRecord rappresenta una tabella di database, mentre una istanza
di CActiveRecord rappresenta una tupla. CActiveRecord è utile per la scrittura
semplificata di interrogazioni per la gestione di operazioni CRUD
http://www.yiiframework.com/doc/api/1.1/CDbConnection
Pagina 4 di 35 Bruno Rossi - PHP User Group Pavia - 29/09/2012
5. Yii, componenti principali
● CErrorHandler gestione degli errori e delle eccezioni
http://www.yiiframework.com/doc/api/1.1/CErrorHandler
● CHttpSession gestione di sessioni HTTP e delle relative configurazioni, layer
di astrazione per la variabile superglobale $_SESSION
http://www.yiiframework.com/doc/api/1.1/CHttpSession
● CHttpRequest layer di astrazione per l'accesso alle variabili superglobali PHP
(es. $_POST, $_SERVER, $_COOKIE). Risolve inconsistenze fra richieste
HTTP che provengono da differenti tipi di browser, fornisce accesso a cookie e
vari metodi per ispezionare le proprietà delle richieste HTTP
http://www.yiiframework.com/doc/api/1.1/CHttpRequest
● CClientScript gestione javascript non intrusivo e CSS utilizzati da view
http://www.yiiframework.com/doc/api/1.1/CClientScript
● CPhpMessageSource permette la traduzione in differenti linguaggi dei
messaggi di base utilizzati da Yii
http://www.yiiframework.com/doc/api/1.1/CPhpMessageSource
Pagina 5 di 35 Bruno Rossi - PHP User Group Pavia - 29/09/2012
6. Yii, componenti principali
● CSecurityManager funzionalità di hashing e encryption
http://www.yiiframework.com/doc/api/1.1/CSecurityManager
● CStatePersister implementa un sistema di persistenza basato su file, i dati
salvati sono condivisi fra tutte le richieste HTTP
http://www.yiiframework.com/doc/api/1.1/CStatePersister
● CUrlManager parsing, creazione facilitata e riscrittura di URI
http://www.yiiframework.com/doc/api/1.1/CUrlManager
● CWebUser informazioni sull'utente corrente, dopo l'autenticazione è possibile
accedere alle informazioni utente tramite Yii::app()->user
http://www.yiiframework.com/doc/api/1.1/CWebUser
● CThemeManager gestione dei temi grafici
http://www.yiiframework.com/doc/api/1.1/CThemeManager
● CList, CTyped List, CMap, CAttributeCollection, CQueue, CStack per la
gestione facilitata di collezioni, liste, code, ecc.
Pagina 6 di 35 Bruno Rossi - PHP User Group Pavia - 29/09/2012
7. Model View Controller
Model View Controller (MVC) is one of the most
quoted (and most misquoted) patterns around. It
started as a framework developed by Trygve
Reenskaug for the Smalltalk platform in the late
1970s. Since then it has played an influential role
in most UI frameworks and in the thinking about
UI design.
Martin Fowler
http://martinfowler.com
Pagina 7 di 35 Bruno Rossi - PHP User Group Pavia - 29/09/2012
8. Model View Controller
● MVC è un pattern design di tipo architetturale che promuove la separazione
dei compiti fra 3 strati che interagiscono ai fini del funzionamento del sistema
● Model fornisce la struttura e l'accesso ai dati, implementa la logica applicativa
(business logic)
● View fornisce agli utenti la presentazione dei dati e le interfacce di interazione
● Controller riceve le richieste utente (in genere attraverso il View) e modifica lo
stato di Model e View
● la guida ad Yii definisce le migliori pratiche per utilizzare MVC
http://www.yiiframework.com/doc/guide/1.1/en/basics.best-practices
● "Model grasso, Controller magro" è una buona regola per promuovere il
riutilizzo della logica applicativa
Pagina 8 di 35 Bruno Rossi - PHP User Group Pavia - 29/09/2012
9. Yii MVC
URI
www.miosito.it?r=news/view
www.miosito.it/news/view
File: NewsController.php
class NewsController extends CController
{
public function actionIndex()
{
// ...
}
public function actionView()
{
// ...
}
}
Pagina 9 di 35 Bruno Rossi - PHP User Group Pavia - 29/09/2012
10. Yii MVC
● le richieste HTTP hanno tutte un singolo punto d'ingresso ovvero il file
index.php (entry script)
● index.php include il file yii.php, definisce una costante DEBUG_MODE e
istanzia la classe CApplication che implementa il design pattern front
controller, ovvero tutte le richieste vengono gestite tramite un singolo oggetto
che risolve URI e utilizza altri oggetti ai fine dell'implementazione concreta
dei comandi
● CApplication utilizza CHttpRequest al fine di ottenere informazioni riguardo
le caratteristiche e i valori relativi alla richiesta HTTP
● CApplication utilizza CUrlManager al fine di individuare l'oggetto Controller
(componente CController o classi derivate) da istanziare e l'azione da eseguire
(metodo pubblico dell'oggetto Controller il cui nome segue la convenzione
action<Nome>). URI: /?r=controller/azione, oppure /controller/azione
Pagina 10 di 35 Bruno Rossi - PHP User Group Pavia - 29/09/2012
11. Yii MVC
● il metodo azione instanzia Model e ne invoca i metodi ai fini dell'applicazione
della logica di business e dell'accesso alle sorgenti dati (CActiveRecord,
CDbConnection, CModel, CFormModel)
● il metodo azione invocato visualizza un View (CWidget, CPortlet)
popolandolo con i dati ritornati da Model
● View viene inserito all'interno di un layout opzionale, selezionabile per
Controller e Action
● la risposta HTTP con le opportune intestazioni e il corpo così composto viene
inviata al client
Pagina 11 di 35 Bruno Rossi - PHP User Group Pavia - 29/09/2012
12. Struttura
● webroot/index.php script di entrata al quale vengono dirette tutte le richieste
HTTP
● webroot/protected contiene il cuore dell'applicazione
CWebApplication::basePath
● webroot/protected/config contiene script di configurazione (main.php per
applicazioni web, console.php per applicazioni a riga di comando, test.php per
la configurazione dei test)
● webroot/protected/runtime contiene i file temporanei generati runtime
dall'applicazione (CApplication::runtimePath)
● webroot/protected/extensions contiene le estensioni di terze parti
(Capplication::extensionPath)
● webroot/protected/modules contiene moduli
Pagina 12 di 35 Bruno Rossi - PHP User Group Pavia - 29/09/2012
13. Struttura
● webroot/protected/controllers contiene i controller, un file per ogni classe
controller di cui abbiamo bisogno (CWebApplication::controllerPath)
● webroot/protected/views contiene i file php relativi a view di sistema, a view
per i controller e a view di layout (CWebApplication::viewPath)
● webroot/protected/views/layouts contiene view di layout
(CWebApplication::layoutPath)
● webroot/protected/views/system contiene view per la visualizzazione di
errori e/o Exception (CWebApplication::systemViewPath)
● webroot/assets contiene i file asset, file css e js che devono essere pubblicati
per essere resi accessibili agli utenti (CAssetManager::basePath)
● webroot/themes contiene i vari temi grafici applicabili al sistema
(CThemeManager::basePath)
Pagina 13 di 35 Bruno Rossi - PHP User Group Pavia - 29/09/2012
14. Esempio di file protected/config/main.php
// array di configurazione
return array(
'basePath' => dirname(__FILE__).DIRECTORY_SEPARATOR.'..',
'name' => 'My Toy App',
'defaultController' => 'site',
// autocaricamento delle classi Model e Component
'import' => array(
'application.models.*',
'application.components.*',
),
// caricamento dei moduli, in questo caso Gii
'modules' => array(
'gii' => array(
'class' => 'system.gii.GiiModule',
...
),
),
Pagina 14 di 35 Bruno Rossi - PHP User Group Pavia - 29/09/2012
15. Esempio di file protected/config/main.php
// configurazione dei componenti
'components' => array(
'user' => array(
// abilita autenticazione basata sui cookies
'allowAutoLogin' => true,
),
// gestione degli urls
'urlManager' => array(
...
'rules' => array(...),
),
// connessione al database
'db' => array(
'connectionString' => 'mysql:host=localhost;port=...;dbname=mytoyapp',
'username' => 'bruno',
'password' => 'xxx',
),
Pagina 15 di 35 Bruno Rossi - PHP User Group Pavia - 29/09/2012
16. Moduli
● i moduli sono unità funzionali poste all'interno di webroot/protected/modules
● ogni modulo contiene propri model, view, controller e componenti di supporto
● promuovono la riusabilità del codice in quanto un modulo può essere
riutilizzato in più applicazioni
● promuovono la segregazione e la manutenibilità del codice, moduli differenti
possono essere manutenuti e testati in maniera indipendente da differenti
gruppi di lavoro
● URI: index.php?r=modulo/controller/azione, oppure /modulo/controller/azione
Pagina 16 di 35 Bruno Rossi - PHP User Group Pavia - 29/09/2012
17. Web e Console
● CWebApplication per applicazioni web
● CConsoleApplication per applicazioni a riga di comando, utilizzate ad
esempio per operazioni di supporto alle applicazioni web (cron job)
● yiic (Linux) e yiic.bat (Windows) script eseguibili
● yiic help mostra la lista di tutti i comandi di sistema (inclusi di default nel
framework) e di quelli sviluppati dagli utenti
● yiic help <command-name> informazioni riguardo un comando specifico
● yiic <command-name> [parameters] per eseguire un comando
● yiic <command-name> <action-name> [parameters] nel caso si vogliano
utilizzare più azioni per un singolo comando
● yiic webapp webroot/cartella_nome_progetto per generare lo scheletro di
un'applicazione web
Pagina 17 di 35 Bruno Rossi - PHP User Group Pavia - 29/09/2012
18. Estensioni
● Yii dispone di un vasto numero di estensioni plug and play, ricercabili e
scaricabili dal sito: http://www.yiiframework.com/extension
● il sito delle estensioni è ben strutturato con suddivisione per area funzionale
(database, caching, console, ecc.) e per popolarità
● possiamo creare nuove estensioni ai fini della massima riusabilità del codice
(stessa estensione per differenti progetti di differenti sviluppatori)
● raccogliete informazioni inerenti l'estensione d'interesse (supporto, stato dello
sviluppo, popolarità, documentazione disponibile) e verificatene la “qualità”
del codice
● non dimenticate che un'estensione può farvi risparmiare tempo ma anche
farvene perdere
● siate cauti, la qualità delle estensioni è nelle mani dei vari creatori
Pagina 18 di 35 Bruno Rossi - PHP User Group Pavia - 29/09/2012
19. Autogenerazione del codice
● via interfaccia web mediante il componente denominato Gii
● via yiic (deprecata a partire dalla versione 1.1.2)
● Gii fornisce dei generatori per uno specifico tipo di codice: Model, Controller,
Form, CRUD (interfaccia web completa per operazioni di creazione,
aggiornamento, lettura e cancellazione), Module
● ogni generatore dispone di uno specifico template di default
● Gii è estensibile
● si possono sviluppare nuovi generatori per la generazione di codice ad hoc (es.
Widget o Portlet specifici)
● si possono sviluppare nuovi template applicabili in alternativa a quelli di
default
Pagina 19 di 35 Bruno Rossi - PHP User Group Pavia - 29/09/2012
20. Gii e applicazioni CRUD, un esempio pratico
● un'azienda necessita di un sistema di gestione dei contenuti per la
pubblicazione di 2 differenti tipi di risorsa: libri e DVD
● supponendo di avere come requisito l'utilizzo di un database SQL, analizzo
possibili strutture dati
● single table inheritance: una tabella che contiene una colonna per ciascuna
proprietà di ogni tipo di risorsa
● concrete table inheritance: una tabella per ciascun tipo di risorsa, ogni tabella
definisce colonne per le proprietà della risorsa alla quale si riferisce
● class table inheritance: una tabella che contiene le colonne relative alle
proprietà comuni a tutte le risorse, una tabella che contiene le colonne per le
proprietà specifiche di ogni risorsa. La tabella generale mantiene una relazione
uno a uno con ogni tabella specializzata
Pagina 20 di 35 Bruno Rossi - PHP User Group Pavia - 29/09/2012
21. Gii e applicazioni CRUD, un esempio pratico
Tabelle Database
UML Classi Yii
Concrete Table Inheritance
http://martinfowler.com
Pagina 21 di 35 Bruno Rossi - PHP User Group Pavia - 29/09/2012
22. Gii e applicazioni CRUD, un esempio pratico
Tabelle Database
UML Classi Yii
Class Table Inheritance
http://martinfowler.com
Pagina 22 di 35 Bruno Rossi - PHP User Group Pavia - 29/09/2012
23. Gii e applicazioni CRUD, un esempio pratico
● le soluzioni concrete table inheritance e class table inheritance ben si adattano
a Gii. A puri scopi dimostrativi decido di optare per concrete table inheritance.
● genero la struttura SQL e creo il relativo database
● genero lo scheletro dell'applicazione: yiic webapp webroot/toygiiapp
● configuro Gii tramite webroot/protected/main.php
● configuro la connessione al database tramite webroot/protected/main.php
● accedo a Gii via web browser, yourapp.local/?r=gii o yourapp.local/gii
● genero i Model (CActiveRecord) per ogni tabella
● genero Create Read Update Delete per ogni tabella
● miglioro le interfacce grafiche (form) e applico un layout o un tema specifico
Pagina 23 di 35 Bruno Rossi - PHP User Group Pavia - 29/09/2012
24. Gii e applicazioni CRUD, un esempio pratico
● ma... la stessa azienda ha bisogno di un nuovo tipo di risorsa
● creo nuova tabella SQL, genero nuovo Model, genero nuovo CRUD
● ma... dopo 1 anno l'azienda decide di associare una nuova caratteristica
“codice materiale di produzione” alla risorsa “libro”
● modifico la tabella SQL, genero nuovo Model che sovrascrive il precedente,
genero nuovo CRUD che sovrascrive il precedente
● prima di sovrascrivere posso verificare le differenze tramite i file originali e i
nuovi file generati mediante lo strumento diff fornito da Gii
● un'altra azienda ha necessità di una struttura identica
● autogenero il codice, applico un layout e/o un tema specifico
Pagina 24 di 35 Bruno Rossi - PHP User Group Pavia - 29/09/2012
25. Gii, altre considerazioni
● si generano Model a partire dalla struttura del database relazionale
● a partire da Model si possono generare interfacce per le operazioni CRUD
(Create Read Update Delete)
● un vantaggio su tutti: abbatto i tempi di sviluppo
● basta con le operazioni ripetitive, mi concentro su altri aspetti dello sviluppo o
su progetti più complessi
● il codice generato segue uno schema preciso (template) e quindi è più
facilmente comprensibile e manutenibile
● può essere necessario adottare una progettazione che consenta di limitare il
quantitativo di codice generato
Pagina 25 di 35 Bruno Rossi - PHP User Group Pavia - 29/09/2012
26. Internazionalizzazione (i18n) e localizzazione (L10n)
● l'internazionalizzazione e la localizzazione sono i processi di adattamento di un
prodotto, pensato e progettato per un mercato o un ambiente definito, ad altri
mercati o ambienti, in modo particolare altre nazioni e culture
● l'internazionalizzazione viene applicata durante la fase di progettazione del
prodotto, e cioè in tale fase vengono predisposti tutti gli elementi perché il
prodotto possa essere facilmente venduto sul mercato internazionale
● la localizzazione invece si applica al prodotto che viene venduto su un mercato
estero particolare e completa il prodotto stesso con le traduzioni del testo o con
l'adattamento alla particolare cultura locale
Pagina 26 di 35 Bruno Rossi - PHP User Group Pavia - 29/09/2012
27. Yii, i18n e L10n
● CLocale è il componente che definisce proprietà e metodi ai fini della
formattazione di simboli di valute, formati di numeri, formati di date e stringhe
relative (mesi, giorni) in base alle usanze delle varie aree geografiche
● locale è espresso tramite un codice che può assumere i seguenti formati:
IDLinguaggio (es. en, it) oppure IDLinguaggio_IDLocazioneGeografica (es.
en_GB, en_US)
● CApplication::sourceLanguage rappresenta il codice locale utilizzato per la
scrittura del codice sorgente
● CApplication::language rappresenta il codice locale relativo alla destinazione
d'uso dell'applicazione (target language)
● CApplication::language può essere valorizzato tramite file di configurazione o
durante l'esecuzione degli script prima che siano richieste funzionalità di
localizzazione
Pagina 27 di 35 Bruno Rossi - PHP User Group Pavia - 29/09/2012
28. Yii, i18n e L10n
● CLocale::getInstance($localeID) o CApplication::getLocale($localeID=null)
ritornano una istanza dell'oggetto CLocale a partire da un dato codice
● CApplication::getLocale($localeID=null) utilizza il codice assegnato al target
language (CApplication::language) nel caso in cui non venga valorizzato
l'argomento $localeID
● il metodo Yii::t($contesto, $messaggio) traduce un messaggio dal linguaggio
sorgente (CApplication::sourceLanguage) al linguaggio di destinazione
(CApplication::language). Lo stesso messaggio può avere traduzioni differenti
in base alla stringa contesto ($contesto) utilizzata
● le traduzioni possono essere fornite basandosi su tecnologie differenti:
CPhpMessageSource (array chiave valore), CDbMessageSource (database),
CGettextMessageSource (GNU Gettext)
● CHttpRequest::getPreferredLanguage() tenta di ritornare il linguaggio dalle
intestazioni della richiesta HTTP (Accept-Language: una lista di valori divisi
da ; che indicano i linguaggi preferibili per la risposta)
Pagina 28 di 35 Bruno Rossi - PHP User Group Pavia - 29/09/2012
29. Caching, cos'è e come funziona
● il sistema di caching è un componente che immagazzina i dati in modo che le
medesime richieste future siano servite più velocemente.
● non si tratta di un sistema di memorizzazione persistente, la cache scade
● un client richiede alla nostra applicazione di trovare tutti gli hotel in zona
Stradella (Pavia)
● la nostra applicazione esegue una serie di operazioni al fine di comporre il
corpo della risposta HTTP
● l'applicazione memorizza i risultati di queste operazioni in un'area di
immagazzinamento con alta velocità di recupero mediante una struttura chiave
valore, la chiave è calcolata dall'applicazione mediante un algoritmo specifico
a partire dalle informazioni contenute nella richiesta HTTP
● un client esegue la medesima richiesta iniziale
Pagina 29 di 35 Bruno Rossi - PHP User Group Pavia - 29/09/2012
30. Caching, cos'è e come funziona
● l'applicazione calcola la chiave relativa alla nuova richiesta ed esegue una
ricerca sul meccanismo di immagazzinamento veloce
● se la chiave viene trovata i risultati sono recuperati dal meccanismo di
immagazzinamento veloce (cache hit)
● altrimenti l'operazione verrà nuovamente eseguita (cache miss)
● la cache si pone a più livelli (web server, bytecode, database)
● la cache può sgravare alcuni meccanismi dall'elaborazione di richieste
ripetitive
● la cache va aggiornata e vanno previste ed implementate logiche a tal fine
● se i ritmi di aggiornamento sono elevati ed è necessario fornire esclusivamente
contenuti aggiornati può essere controproducente
Pagina 30 di 35 Bruno Rossi - PHP User Group Pavia - 29/09/2012
31. Caching secondo Yii
● Yii presenta tipi differenti di gestori cache che estendono la classe base CCache
ed implementano la medesima interfaccia ICache
● è possibile cambiare sistema di caching in corso d'opera senza modificare codice
nell'applicazione
● tipologie supportate: CMemCache (PHP memcache extension), CApcCache
(PHP APC extension), CXCache (PHP XCache extension),
CEAcceleratorCache (PHP EAccelerator extension), CDbCache (database,
utilizza una tabella di database SQLite3 posta nella cartella di runtime),
CZendDataCache (Zend Data Cache), CFileCache (file, ideale per grosse fette
di dati), CDummyCache (per gestire le attività di sviluppo qualora non sia
disponibile un sistema di caching)
● il sistema di caching si configura tramite il file /protected/config/main.php:
'components' => array('cache' => array('class' => 'system.caching.CXCache' ...
● i metodi principali utilizzati all'interno dell'applicazione sono
Yii::app()->cache->get($id)
Yii::app()->set($id, $value, $expire, $dependency)
Pagina 31 di 35 Bruno Rossi - PHP User Group Pavia - 29/09/2012
32. Performance
http://www.yiiframework.com/performance
Pagina 32 di 35 Bruno Rossi - PHP User Group Pavia - 29/09/2012
33. Argomenti per la seconda parte...
● Yii e database, Data Access Object e Active Record, attenzione ai modelli
anemici
● unit testing, codice sotto controllo e Test Driven Development
● autenticazione e autorizzazione
● temi
● logging
● gestione degli errori
● gestione degli Url
Pagina 33 di 35 Bruno Rossi - PHP User Group Pavia - 29/09/2012
34. Risorse
● Sito web - http://www.yiiframework.com
● Documentazione online - http://www.yiiframework.com/doc
● The Definitive Guide to Yii 1.1, Qiang Xue and Xiang Wei Zhuo -
http://www.yiiframework.com/download
● Building a blog system using Yii, Qiang Xue -
http://www.yiiframework.com/download
● Yii 1.1 Application Development Cookbook - Packt Publishing 2011,
Alexander Makarov
● Agile Web Application Development with Yii 1.1 and PHP5 - Packt
Publishing 2012, Jeffrey Winesett
● PRADO PHP Rapid Application Development Object -
http://www.pradosoft.com
● My Toy Gii App - https://github.com/brunorossi/giitoyapp
Pagina 34 di 35 Bruno Rossi - PHP User Group Pavia - 29/09/2012
35. Grazie a
● i ragazzi del PUG Pavia
● tutti i partecipanti
● la mia famiglia
● Publicenter Web - http://www.publicenterweb.it/
● Opimaint S.r.l. - http://www.opimaint.it/
Pagina 35 di 35 Bruno Rossi - PHP User Group Pavia - 29/09/2012