Guida completa a Zend Framework
Leggila su HTML.it
Recentemente la Zend, società che supporta a livello enterprise lo sviluppo e la distribuzione di Php, ha introdotto una serie di interessanti novità tra i propri prodotti. Tra queste non possiamo rimanere indifferenti al rilascio, ancora in versione beta, di un framework ad oggetti per Php 5 che fornisce una serie di librerie e funzionalità di tutto rispetto che vanno a colmare la maggior parte delle lacune che si possono riscontrare nella libreria standard fornita con Php.
Il framework sviluppato dalla Zend, chiamato per l'appunto Zend Framework, è ben documentato e presenta moltissime funzionalità interessanti per velocizzare lo sviluppo delle proprie applicazioni. Tra queste possiamo citare un'implementazione di Lucene (il famosa libreria di ricerca ed indicizzazione sviluppata in Java dall'Apache Software Foundation) in Php, una completa libreria per la lettura e la scrittura di documenti Pdf, una serie di funzionalità per lo sviluppo di siti internet basandosi sul pattern MVC (Model-View-Control, che in questo periodo è diventato/ritornato il cavallo di battaglia di molti sviluppatori, forse anche grazie alla nascita di Ruby on Rails) e un'interfaccia ad oggetti per l'accesso ai database.
In questo articolo introdurrò il modulo Zend_Controller
, che, come accennato precedentemente, si compone di una serie di classi e funzioni per facilitare l'implementazione di siti internet o applicazioni web basate sul pattern MVC. Per informazioni specifiche sulla configurazione e l'installazione del framework rimando alla documentazione ufficiale.
Struttura e funzionamento del modulo Zend_Controller
Prima di vedere qualcosa di pratico è interessante analizzare come gli sviluppatori dello Zend Framework hanno deciso di implementare questo modulo e come il modulo stesso si comporta; è bene ricordare che il modulo Zend_Controller è stato pensato per essere leggero, modulare e flessibile e non fornisce una soluzione completa come potrebbero farlo TurboGears per Python o Symphony per Php.
Il funzionamento logico viene guidato da una serie di classi:
-
Zend_Controller_Front: è un'implementazione del pattern FrontController che si occupa di intercettare tutte le richieste fatte al server e di delegarle agli Zend_Controller_Action;
-
Zend_Controller_Action: è la classe base che rappresenta un Controller. Ogni controller infatti estende questa classe e fornisce una serie di metodi che verranno esposti al sistema per l'esecuzione quando richiesti;
-
Zend_Controller_Router: è la classe che viene utilizzata per trasformare una richiesta URL in un oggetto Zend_Controller_Dispatcher_Token. Questo oggetto contiene informazioni sul nome del controller richiesto, sul nome dell'azione che si dovrebbe eseguire e la serie di parametri inviati durante la richiesta. I parametri sono estratti, come vedremo in seguito, anche dall'URL stesso.
-
Zend_Controller_Dispatcher: riceve il risultato del processo di routing e si occupa di trovare e caricare il file fisico che implementa il controller richesto, istanziare l'implementazione della classe Zend_Controller_Action (che deve essere fornita obbligatoriamente) e richiamare il metodo richiesto. Alla fine di questo processo il controllo ritorna allo Zend_Controller_Front che si occupa di richiamare nuovamente il dispatcher nel caso in cui il controller eseguito abbia richiesto l'esecuzione di altri metodi.
Il processo è lineare e facilmente implementabile in altri linguaggi o framework già esistenti. La cosa interessante è che il sistema stesso si integra con lo Zend Framework lavorando utilizzando le eccezioni (differentemente dalle implementazioni native di altre librerie che si basano ancora sull'ormai obsoleto sistema di notifica degli errori) e tutte quelle funzionalità introdotte con il miglioramento del modello ad oggetti e della SPL (Standard Php Library), con il risultato che finalmente si ha a disposizione uno strumento che potrebbe invogliare la comunità Php e gli hoster stessi ad aggiornare i propri piani verso qualcosa di più recente rispetto alle soluzioni obsolete ancora utilizzate.
Lo Zend_Controller_Router implementa un sistema molto semplice per estrarre le informazioni da inviare al dispacther dagli URL. Nelle prossime versioni il sistema verrà aggiornato per dare un po' più di flessibilità rispetto a quello attuale, che invece risulta poco flessibile e molto semplice. Le informazioni da un URL sono estratte interpretando l'URL nel modo seguente: http://host/controller/action/key1/value1/key2/value2/...
Il primo token è l'host verso cui viene effettuata la richiesta, segue il nome del controller, il nome dell'azione ed una serie di coppie chiave valore opzionali che verranno utilizzate come parametri per l'azione. Sia il controller sia l'azione stessa sono opzionali. Se l'azione non viene specificata viene richiamata in automatico l'azione index del controller specificato. Nel caso in cui invece il controller non fosse specificato, viene richiamata l'azione index del controller index.
L'idea dietro a questo approccio è quella di supportare URL puliti senza query string; al fine di gestire correttamente il sistema à necessario quindi avere a disposizione un server web che fornisca sistemi di riscrittura degli URL al fine di indirizzare tutte le chiamate ad un'unica pagina Php (index.php
) che istanzierà le componenti necessarie per la corretta interpretazione dell'URL. Php normalmente viene eseguito con Apache, e questo webserver fornisce un modulo opzionale, chiamato mod_rewrite, che supporta la riscrittura degli URL.
Per far funzionare correttamente il modulo su Apache è necessario inserire nella root del webserver un file index.php che esponga le funzionalità dello Zend_Controller ed un file .htaccess
contenente delle regole che reindirizzino tutte le richieste che potrebbero corrispondere a chiamate verso dei controller al file index.php; questa soluzione può essere archiviata utilizzando un approccio che reindirizzi tutte le chiamate eccetto quelle fatte a file statici:
RewriteEngine On
RewriteRule !.(js|ico|gif|png|jpg|css)$ index.php
Utilizzare il modulo Zend_Controller
Dopo aver compreso il comportamento del modulo e come configurare il server affinchè ci aiuti a reindirizzare correttamente le richieste HTTP, possiamo passare all'implementazione pratica del file che si occuperà di esporre le funzionalità del modulo. Il file in questione sarà quello a cui reindirizziamo tutte le chiamate dinamiche usando mod_rewrite, quindi nel nostro caso specifico sarà index.php. Se si intende utilizzare il comportamento standard del modulo senza sfruttare la sua modularità, il contenuto del file sarà veramente semplice:
<?php
require_once 'Zend/Controller/Front.php';
Zend_Controller_Front::run('/var/www/html/controllers');
?>
Viene inclusa la libreria (presupponendo che il path in cui risiedono i sorgenti si trovi all'interno dell'include_path
) e viene eseguito il metodo static run
della classe Zend_Controller_Front passando come argomento il path (percorso) fisico alla cartella che contiene i controller eseguibili. Nella documentazione ufficiale dello Zend Framework consigliano di mantenere una struttura delle directory della propria applicazione omogenea con quella degli altri al fine di uniformare le scelte di sviluppo. La struttura proposta à la seguente:
/application /models /views /controllers /document_root /images /styles .htaccess index.php /library /Zend
Dopo aver impostato il file index.php à necessario creare un file chiamato IndexController.php
da posizionare all'interno delle directory che contiene i controller, che verrà richiamato automaticamente nel caso non venga specificata alcuna informazione oltre l'host nell'URL richiamato. Il contenuto di questo file sarà il seguente:
<?php
require_once 'Zend/Controller/Action.php';
class IndexController extends Zend_Controller_Action
{
public function indexAction()
{
echo 'Hello World';
}
public function noRouteAction()
{
$this->_redirect('/');
}
}
?>
Come abbiamo introdotto precedentemente, il controller deve obbligatoriamente estendere Zend_Controller_Action e deve esporre le azioni richiamabili come metodi pubblici che terminano in Action. Il metodo noRouteAction viene richiamato quando la classe Zend_Controller_Router non riesce a richiamare l'azione specificata attraverso il dispatcher utilizzato.
La classe Zend_Controller_Action contiene i seguenti metodi che vengono utilizzati per implementare la logica applicativa:
-
_redirect(url): accetta come parametro una stringa ed effettua un reindirizzamento all'URL specificato;
-
_forward(controller, action [, params]): accetta come argomenti il nome di un controller, l'azione da richiamare e un'array opzionale di parametri da passare. Esegue l'azione specificata;
-
_getParam(name [, default]): recupera il parametro con nome specificato come primo argomento e restituisce il secondo argomento nel caso in cui il parametro non esista;
-
_getAllParams(): recupera un array contenente tutti i parametri passati all'azione;
Prime conclusioni
Siamo giunti alla fine di questa primissima introduzione allo Zend Framework e all'utilizzo del modulo Zend_Controller. Tengo a precisare che il framework, e soprattuto questo modulo, sono ancora in via di crescita e di evoluzione, e quindi à possibile che nel futuro il comportamento specifico di alcune componenti abbia delle variazioni. Torneremo spesso sull'argomento perchè ritengo importante imparare ad utilizzare un framework con queste potenzialità, e soprattutto ritengo importante comprendere ed analizzare il funzionamento e l'architettura di librerie scritte da sviluppatori con molta esperienza ed a stretto contatto con le scelte progettuali fatte per un determinato linguaggio. Per ora posso solo spronarvi ad utilizzare il framework e condividere le vostre esperienze con la comunità in modo da supportare lo sviluppo fino alla prima release stabile, assicurandovi altri approfondimenti nel futuro.