Yii Framework - yes it is rapid web application development (Parte 1)

download Yii Framework - yes it is rapid web application development (Parte 1)

If you can't read please download the document

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