Yii Framework - yes it is rapid web application development (Parte 1)
-
Upload
brossi676 -
Category
Technology
-
view
2.433 -
download
0
Transcript of Yii Framework - yes it is rapid web application development (Parte 1)
Yii Framework
Yes it is rapid web application development (parte 1)
Bruno Rossi ([email protected])Senior Web DeveloperPHP 5.0 Zend Certified EngineerSun MySQL5.0 Certified Developer
PHP User Group Pavia - http://pavia.grusp.org
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 di
Bruno Rossi - PHP User Group Pavia - 29/09/2012
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 di
Bruno Rossi - PHP User Group Pavia - 29/09/2012
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 di
Bruno Rossi - PHP User Group Pavia - 29/09/2012
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 di
Bruno Rossi - PHP User Group Pavia - 29/09/2012
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 di
Bruno Rossi - PHP User Group Pavia - 29/09/2012
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 di
Bruno Rossi - PHP User Group Pavia - 29/09/2012
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 di
Bruno Rossi - PHP User Group Pavia - 29/09/2012
Yii MVC
URIwww.miosito.it?r=news/view
www.miosito.it/news/view
File: NewsController.phpclass NewsController extends CController{ public function actionIndex() { // ... } public function actionView() { // ... }}
Pagina di
Bruno Rossi - PHP User Group Pavia - 29/09/2012
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). URI: /?r=controller/azione, oppure /controller/azione
Pagina di
Bruno Rossi - PHP User Group Pavia - 29/09/2012
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 di
Bruno Rossi - PHP User Group Pavia - 29/09/2012
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 di
Bruno Rossi - PHP User Group Pavia - 29/09/2012
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 di
Bruno Rossi - PHP User Group Pavia - 29/09/2012
Esempio di file protected/config/main.php
Pagina di
Bruno Rossi - PHP User Group Pavia - 29/09/2012
// array di configurazionereturn 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', ... ), ),
Esempio di file protected/config/main.php
Pagina di
Bruno Rossi - PHP User Group Pavia - 29/09/2012
// 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', ),
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 di
Bruno Rossi - PHP User Group Pavia - 29/09/2012
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 informazioni riguardo un comando specifico
yiic [parameters] per eseguire un comando
yiic [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 di
Bruno Rossi - PHP User Group Pavia - 29/09/2012
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 di
Bruno Rossi - PHP User Group Pavia - 29/09/2012
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 di
Bruno Rossi - PHP User Group Pavia - 29/09/2012
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 di
Bruno Rossi - PHP User Group Pavia - 29/09/2012
Gii e applicazioni CRUD, un esempio pratico
Pagina di
Bruno Rossi - PHP User Group Pavia - 29/09/2012
UML Classi Yii
Tabelle Database
Concrete Table Inheritance http://martinfowler.com
Gii e applicazioni CRUD, un esempio pratico
Pagina di
Bruno Rossi - PHP User Group Pavia - 29/09/2012
Tabelle Database
UML Classi Yii
Class Table Inheritance http://martinfowler.com
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 di
Bruno Rossi - PHP User Group Pavia - 29/09/2012
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 di
Bruno Rossi - PHP User Group Pavia - 29/09/2012
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 di
Bruno Rossi - PHP User Group Pavia - 29/09/2012
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 di
Bruno Rossi - PHP User Group Pavia - 29/09/2012
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 di
Bruno Rossi - PHP User Group Pavia - 29/09/2012
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 di
Bruno Rossi - PHP User Group Pavia - 29/09/2012
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 di
Bruno Rossi - PHP User Group Pavia - 29/09/2012
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 di
Bruno Rossi - PHP User Group Pavia - 29/09/2012
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 di
Bruno Rossi - PHP User Group Pavia - 29/09/2012
Performance
http://www.yiiframework.com/performance
Pagina di
Bruno Rossi - PHP User Group Pavia - 29/09/2012
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 di
Bruno Rossi - PHP User Group Pavia - 29/09/2012
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 di
Bruno Rossi - PHP User Group Pavia - 29/09/2012
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 di
Bruno Rossi - PHP User Group Pavia - 29/09/2012