Zend Framework e i context JSON, HTML e XML

Creato il 16 giugno 2010 da Blogrammazione

Qualche giorno fa ho iniziato il nostro percorso di conoscenza “avanzata” di Zend Framework raccontando in questo articolo come il framework gestisce le transazioni sui nostri database.

Con questo articolo proseguiamo la conoscenza di Zend Framework trattando un altro interessante argomento di vitale importanza per lo sviluppo di un’applicazione web “moderna” che possa interagire con il mondo esterno utilizzando le principali tecniche e i più diffusi protocolli di comunicazione. L’argomento che vediamo è la gestione dei contesti (context) in Zend Framework.

Un’applicazione web moderna deve poter interagire con migliaia di altre applicazioni web, ricevere feed, inviare contenuto, gestire chiamate asincrone, ecc.

Diventa dunque estremamente importante avere a disposizione uno strumento che permetta di gestire la maggior parte delle interazioni con un meccanismo semplice, intuitivo e rapido da utilizzare e capire….ed è proprio quello di cui dispone Zend Framework.

Zend Framework implementa il pattern MVC, in cui il Controller è l’elemento che si occupa di “leggere” la richiesta ricevuta, di inoltrare tale richiesta a chi la sa gestire e di “restituire” il responso. Ed è proprio qui che i context giocano un ruolo fondamentale.

Il meccanismo è molto semplice: Zend Framework permette di impostare di volta in volta il “tipo” di responso che può gestire una determinata “action” in un Controller, e dunque le modalità con cui ,attraverso questa action, l’applicativo web può comunicare con il mondo.

Chiariamoci subito i dubbi con un esempio. Supponiamo che al nostro applicativo web guinga una richiesta di questo tipo:

http://www.miodominio.com/public/articolo/list

in altre parole l’applicativo web riceve la richiesta di eseguire la action “list” del Controller “articolo”. Fin qui normale amministrazione: supponiamo che la action “list” non faccia altro che interrogare la nostra base di dati per raccogliere tutti gli articoli presenti nella web application e li restituisca. Quello che noi facciamo è proprio modificare la modalità con cui tale action restituisce i risultati.

In alcuni casi infatti può essere molto comodo avere in risposta una lista di articoli sotto forma di oggetto o array, ma in altri casi può essere molto più comodo ad esempio dover gestire una stringa in formato JSON, in formato HTML o XML. Ad esempio quando dobbiamo gestire chiamate asincrone AJAX è molto comodo ricevere il responso in formato XML o JSON, due “protocolli” di comunicazioni molto diffusi proprio in questo ambito.

Vediamo allora come restituire una stringa JSON a seguito della richiesta ricevuta come da esempio.

Nel Controller “articolo” avremo un metodo “listAction()” per gestire la action “list”, che può essere implementato come segue:


public function listAction() {
[…]
try {
if ( $this->getRequest()->isPost() ) {
[...]
// (1)
$response = array("success" => true, "lista" => $result);
// (2)
$this->_helper->json($response);
[...]
}
} catch ( Exception $e ) {
// (3)
$response = array( "success" => false, "error" => $e->getMessage() );
// (4)
$this->_helper->json($response);
}
[...]
}

Supponendo di ricevere una richiesta tramite POST la action esegue tutte le computazioni del caso (ad esempio crea un oggetto model Articolo, interroga questo oggetto e salva i risultati nella variabile “$result” ) e, se non ci sono stati problemi, invia un responso di successo (“success” => true) con la lista degli articoli (“lista” => $result)) attraverso il protocollo JSON ( $this->_helper->json($response); ) . Chiaramente in caso di problemi verrà eseguito il blocco “catch”, il responso sarà insuccesso (3) e tale responso sarà inviato alla vista (4).

L’ultima cosa che rimane da fare è impostare il contesto, ovvero impostare il fatto che il responso della action “list” sarà in formato JSON. Per fare questo utilizziamo il metodo “init()” dei Controller, utilie proprio per impostare le loro configurazioni di inizializzazione:

public function init() {

$contextSwitch = $this->_helper->getHelper('contextSwitch')
->setContext(
'html', array(
'suffix'    => 'html',
'headers'   => array(
'Content-Type' => 'text/html; Charset=UTF-8',
),
)
->addActionContext('list', 'json')
->addActionContext('crea', 'xml')
->addActionContext('cancella', 'html')
)
->initContext();

}

Come si vede dal codice, utilizziamo l’helper “contextSwitch” per la gestione dei contesti: nel nostro esempio abbiamo imposta sia un contesto JSON per la action “list” di cui sopra, sia un contesto XML e HTML. Quest’ultimo è quello che richiede due parole di più: di default infatti non è disponibile un contesto HTML, ma questo non è assolutamente un problema. La flessibilità di Zend Framework è tale perc cui, in poche righe di codice, possiamo impostare e personalizzare i context a seconda delle nostre necessità….niente male vero?

Per chi volesse approfondire può leggere la pagina della documentazione di Zend Framework dedicata agli Action Helper del componente Zend_Controller.