
Leggila
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
Il framework sviluppato dalla Zend, chiamato per l'appunto Zend Framework Lucene
In questo articolo introdurrò il modulo Zend_Controller
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
-
Zend_Controller_Action:
-
Zend_Controller_Router
-
Zend_Controller_Dispatcher
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
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
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
Per far funzionare correttamente il modulo su Apache è necessario inserire nella root del webserver un file
.htaccess
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)
-
_forward(controller, action [, params])
-
_getParam(name [, default])
-
_getAllParams()
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.