SlideShare a Scribd company logo
1 of 35
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
Performance




                     http://www.yiiframework.com/performance
Pagina 32 di 35                                         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 33 di 35                                                     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 34 di 35                                                   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 35 di 35                                               Bruno Rossi - PHP User Group Pavia - 29/09/2012

More Related Content

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

Hands on MVC - Mastering the Web
Hands on MVC - Mastering the WebHands on MVC - Mastering the Web
Hands on MVC - Mastering the WebClaudio Gandelli
 
Web Api – The HTTP Way
Web Api – The HTTP WayWeb Api – The HTTP Way
Web Api – The HTTP WayLuca Milan
 
Progetto SOD Davide Sito
Progetto SOD Davide SitoProgetto SOD Davide Sito
Progetto SOD Davide SitoDavide Sito
 
Asp.NET MVC Framework
Asp.NET MVC FrameworkAsp.NET MVC Framework
Asp.NET MVC FrameworkDotNetMarche
 
Sistemi Context-aware: Esercitazione 3
Sistemi Context-aware: Esercitazione 3Sistemi Context-aware: Esercitazione 3
Sistemi Context-aware: Esercitazione 3Marco Loregian
 
Sviluppo Web Agile con Castle Monorail
Sviluppo Web Agile con Castle MonorailSviluppo Web Agile con Castle Monorail
Sviluppo Web Agile con Castle MonorailDotNetMarche
 
What's New in ASP.NET 4.5 and Visual Studio 2012
What's New in ASP.NET 4.5 and Visual Studio 2012What's New in ASP.NET 4.5 and Visual Studio 2012
What's New in ASP.NET 4.5 and Visual Studio 2012Andrea Dottor
 
AngularJS – Reinventare le applicazioni web
AngularJS – Reinventare le applicazioni webAngularJS – Reinventare le applicazioni web
AngularJS – Reinventare le applicazioni webLuca Milan
 
Rich client application: MVC4 + MVVM = Knockout.js
Rich client application: MVC4 + MVVM = Knockout.jsRich client application: MVC4 + MVVM = Knockout.js
Rich client application: MVC4 + MVVM = Knockout.jsGiorgio Di Nardo
 
Asp.Net MVC 2 :: VS 2010 Community Tour
Asp.Net MVC 2 :: VS 2010 Community TourAsp.Net MVC 2 :: VS 2010 Community Tour
Asp.Net MVC 2 :: VS 2010 Community TourAndrea Balducci
 
CakePhp Linux Day Torino '09
CakePhp Linux Day Torino '09CakePhp Linux Day Torino '09
CakePhp Linux Day Torino '09Francesco Ronchi
 
Usare le nuove WCF Web Api per creare servizi RESTful
Usare le nuove WCF Web Api per creare servizi RESTfulUsare le nuove WCF Web Api per creare servizi RESTful
Usare le nuove WCF Web Api per creare servizi RESTfulLuca Milan
 
Come portare il profiler di symfony2 in drupal8
Come portare il profiler di symfony2 in drupal8Come portare il profiler di symfony2 in drupal8
Come portare il profiler di symfony2 in drupal8Luca Lusso
 
September 2010 - Gatein
September 2010 - GateinSeptember 2010 - Gatein
September 2010 - GateinJBug Italy
 
Sviluppo Web Agile Con MonoRail
Sviluppo Web Agile Con MonoRailSviluppo Web Agile Con MonoRail
Sviluppo Web Agile Con MonoRailStefano Ottaviani
 
Un progetto open source per la gestione dei processi ICT. Presentazione e dim...
Un progetto open source per la gestione dei processi ICT. Presentazione e dim...Un progetto open source per la gestione dei processi ICT. Presentazione e dim...
Un progetto open source per la gestione dei processi ICT. Presentazione e dim...CMDBuild org
 
Node.js - Server Side Javascript
Node.js - Server Side JavascriptNode.js - Server Side Javascript
Node.js - Server Side JavascriptMatteo Napolitano
 

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

Hands on MVC - Mastering the Web
Hands on MVC - Mastering the WebHands on MVC - Mastering the Web
Hands on MVC - Mastering the Web
 
Web Api – The HTTP Way
Web Api – The HTTP WayWeb Api – The HTTP Way
Web Api – The HTTP Way
 
Progetto SOD Davide Sito
Progetto SOD Davide SitoProgetto SOD Davide Sito
Progetto SOD Davide Sito
 
Asp.NET MVC Framework
Asp.NET MVC FrameworkAsp.NET MVC Framework
Asp.NET MVC Framework
 
Sistemi Context-aware: Esercitazione 3
Sistemi Context-aware: Esercitazione 3Sistemi Context-aware: Esercitazione 3
Sistemi Context-aware: Esercitazione 3
 
Sviluppo Web Agile con Castle Monorail
Sviluppo Web Agile con Castle MonorailSviluppo Web Agile con Castle Monorail
Sviluppo Web Agile con Castle Monorail
 
What's New in ASP.NET 4.5 and Visual Studio 2012
What's New in ASP.NET 4.5 and Visual Studio 2012What's New in ASP.NET 4.5 and Visual Studio 2012
What's New in ASP.NET 4.5 and Visual Studio 2012
 
AngularJS – Reinventare le applicazioni web
AngularJS – Reinventare le applicazioni webAngularJS – Reinventare le applicazioni web
AngularJS – Reinventare le applicazioni web
 
Rich client application: MVC4 + MVVM = Knockout.js
Rich client application: MVC4 + MVVM = Knockout.jsRich client application: MVC4 + MVVM = Knockout.js
Rich client application: MVC4 + MVVM = Knockout.js
 
Asp.Net MVC 2 :: VS 2010 Community Tour
Asp.Net MVC 2 :: VS 2010 Community TourAsp.Net MVC 2 :: VS 2010 Community Tour
Asp.Net MVC 2 :: VS 2010 Community Tour
 
CakePhp Linux Day Torino '09
CakePhp Linux Day Torino '09CakePhp Linux Day Torino '09
CakePhp Linux Day Torino '09
 
Usare le nuove WCF Web Api per creare servizi RESTful
Usare le nuove WCF Web Api per creare servizi RESTfulUsare le nuove WCF Web Api per creare servizi RESTful
Usare le nuove WCF Web Api per creare servizi RESTful
 
Come portare il profiler di symfony2 in drupal8
Come portare il profiler di symfony2 in drupal8Come portare il profiler di symfony2 in drupal8
Come portare il profiler di symfony2 in drupal8
 
introduzione a symfony 2
introduzione a symfony 2 introduzione a symfony 2
introduzione a symfony 2
 
September 2010 - Gatein
September 2010 - GateinSeptember 2010 - Gatein
September 2010 - Gatein
 
DDive - 8.5.2 Xpages - L'evoluzione continua
DDive - 8.5.2 Xpages - L'evoluzione continuaDDive - 8.5.2 Xpages - L'evoluzione continua
DDive - 8.5.2 Xpages - L'evoluzione continua
 
App Engine + Python
App Engine + PythonApp Engine + Python
App Engine + Python
 
Sviluppo Web Agile Con MonoRail
Sviluppo Web Agile Con MonoRailSviluppo Web Agile Con MonoRail
Sviluppo Web Agile Con MonoRail
 
Un progetto open source per la gestione dei processi ICT. Presentazione e dim...
Un progetto open source per la gestione dei processi ICT. Presentazione e dim...Un progetto open source per la gestione dei processi ICT. Presentazione e dim...
Un progetto open source per la gestione dei processi ICT. Presentazione e dim...
 
Node.js - Server Side Javascript
Node.js - Server Side JavascriptNode.js - Server Side Javascript
Node.js - Server Side Javascript
 

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