Naked Zend_Layout e Zend_View
In questo articolo impareremo ad usare Zend_Layout e Zend_View insieme a un front controller semplice per dimostrare come sia possibile avviare la separazione della logica di business e di presentazione all'interno dell'applicazione. Tutto il codice è disponibile su github:
Naked Zend_Layout e Zend_View su GitHub .
MVC
Un comune modello di progettazione per le applicazioni web moderne è il pattern MVC. La Zend Framework in 'full stack' è una modalità di attuazione del MVC in PHP e si compone di tre parti:
- Model (M)
- View (V)
- Controller (C)
Il modello è progettato in modo tale che le imprese e la logica di presentazione sono completamente separati l'uno dall'altro (con la logica di business nel modello, e la presentazione nella visualizzazione) e il controller di seduta in mezzo effettuazione della "orchestra".
Presentazione e logica
Nel Framework Zend la vista è gestita da due componenti principali: Zend_View e Zend_Layout. Zend_Layout come suggerisce il nome si prende cura l'aspetto layout del sito (in genere le intestazioni, piè di pagina, le barre laterali, ecc.) Zend_View incentrata sulla presentazione dei dati che il modello ha lavorato per produrre o derivare.
Come sviluppatori, e le loro applicazioni, si evolvono si tende a passare attraverso varie fasi, in genere ciascuno un miglioramento rispetto alla precedente, migliorando la gestibilità e l'estensibilità. Uno dei problemi principali è che la presentazione e la logica ancora ottenere mescolate e non è semplice per iniziare che separa le due.
Cosa c'è di sbagliato con la miscelazione dei due?
Ci sono diversi motivi per cui mescolare diverse parti della domanda, ad esempio, un designer a lavorare sul sito potrebbero non vogliono (o hanno le conoscenze) per eseguire la scansione in giro in codice cercando di capire dove fare modifiche alla presentazione. Allo stesso modo uno sviluppatore (se siete come me che ha la capacità di progettazione di uno struzzo), può scoppiare in un sudore freddo quando si parla di progettazione o di lavoro UI.
Inoltre, che cosa se poi si desidera presentare i vostri siti su supporti diversi, come i telefoni cellulari, tablet PC, o esporre i dati via web services (XML / JSON / etc)? Dopo aver mescolato la presentazione e la logica ti trovi quasi senza speranza, senza alcuni hack molto brutto per tirare indietro la presentazione del proprio codice, prima di iniettare qualcosa di nuovo. Se i dati e la presentazione è stato separato fare questi cambiamenti sono quasi banale, creare un nuovo script per visualizzare il nuovo formato e le richieste dirette a seconda dei casi.
Che separa le due
In una domanda in continua evoluzione la sua non sempre economico per avviare l'attuazione di una soluzione completa MVC e l'applicazione deve essere migrato lentamente - a volte l'esecuzione di codice vecchio in parallelo con il nuovo. E 'forse che non ci sono masse di logica (come setup di connessione al database, autenticazione, gestione dei cookie, ecc) che non sono pronto per lo stampaggio di configurazione quadri scelti, quindi il vecchio codice e noto-to-be-lavoro possono continuare ad essere utilizzati fino al momento in cui può essere riscritto / refactoring.
Nota: Zend_Layout Uso e Zend_View come questo è perfettamente accettabile nel quadro di paesaggio Zend e il quadro è stato progettato in modo tale che i singoli componenti possono essere utilizzati senza il resto del quadro. Un grande vantaggio nelle applicazioni in continua evoluzione, e probabilmente uno dei motivi principali per il suo elevato assorbimento nelle applicazioni aziendali.
Front Controller
Qui di seguito a creare un front controller - un unico file destinato a raccogliere le richieste che non sono abbinati a un file sul file system. Questo è spesso realizzato usando un file. Htaccess come quello usato di default in Zend Framework installato. Entro il front controller sarò costituire il nostro layout e la vista e mostra dove le diverse parti della ricevuta di domanda in esso.
define ('APP_PATH', dirname (__FILE__).'/..'); / / Output buffering Start ob_start (); / / Crea una istanza Zend_View Zend_Layout:: startMvc (); $ Layout Zend_Layout =:: getMvcInstance (); $ Layout-> setLayoutPath (APP_PATH. '/ Layout / scripts') -> SetViewSuffix ('phtml') - SetLayout> ('indice'); $ View = $ GetView layout-> () - SetScriptPath> (APP_PATH '/ view / scripts'.) - AddHelperPath> (. APP_PATH '/ Library / Zend / Vista / helper', 'Zend_View_Helper'); / / Imposta URL di base - ok * * quasi nudo, ma non hai bisogno di questo! Zend_Controller_Front:: getInstance () -> setBaseUrl ($ _SERVER ['HTTP_HOST']); try { / ** * Eseguire alcune applicazioni di routing ... * - Potrebbe essere usando questo come un front controller e dirigere tutte le richieste * Attraverso il file uno (a condizione file non esiste nel file system * - Si noti il metodo che segue è solo davvero per la dimostrazione, sarebbe * Orribile con un grande sito * / switch ($ ['pagina'] _GET) { caso '"Index": caso di 'eccezione': Pagename = $ $ ['page'] _GET; break; default: $ Pagename = false; break; } / / Non Esempio di una pagina che è trovato ... if ($ PageName === false) { ResponseHeader $ = 'HTTP/1.1 404 Pagina non trovata'; throw new Exception ('Pagina non trovata'); } / ** * Aggiungere dati alla tua vista dell'oggetto qui * Si può avere una propria implementazione del controller o qualche include file * Dove logica aziendale è in parte separato dalla logica vista * / displayText $ view-> = 'Ciao da Lloyd'; ButtonText $ view-> = 'I \' m non attivi '!; ("{$ Phtml PAGENAME}.") $ Layout-> content = render $ view->; echo $ rendere layout-> (); } Catch (Exception $ e) { / / Pulire già tamponata contenuti - non si desidera visualizzare questo! ob_clean (); if (! isset ($ ResponseHeader)) { ResponseHeader $ = 'HTTP/1.1 500 Internal Server Error'; } header ($ ResponseHeader); eccezione $ view-> = $ e; $ Layout-> content = render $ view-> ('error.phtml'); echo $ rendere layout-> (); }
Innanzitutto iniziamo il buffering dell'output, così facendo possiamo impostare la nostra intestazioni in qualsiasi punto la richiesta e sappiamo che è possibile inviare loro. Dovrebbe essere generata un'eccezione in qualsiasi fase dell'esecuzione del codice puliamo questo buffer e scrivere o contenuto del messaggio di errore e il layout. Questo assicura che non consegniamo parte resi contenuti che contengono errori per l'utente finale.
Avanti di una nuova istanza di MVC Zend_Layout è generato e lo abbiamo detto che gli script hanno il layout phtml estensione, si trovano in una directory al di fuori del percorso pubblico, e che il nostro layout di default è chiamata indice (. Phtml). Dal layout abbiamo poi estrarre l'oggetto di visualizzazione (a cui abbiamo fissato i nostri dati da presentare) e si applicano di configurazione simile.
Il prossimo setup l'oggetto vista con un riferimento al helper Zend_View. Visualizza aiutanti sono insiemi di funzionalità la convenienza. Ad esempio, scrivendo un galleggiante in formato monetaria o creazione di una tabella a strisce zebra (si possono leggere qui ). Estendendo Zend_View_Helper_Abstract e aggiungendo la propria libreria, a questo punto la sua possibilità di usare il tuo aiutanti vista applicazione.
Il resto del codice dell'applicazione è ora avvolta in un try {} catch {} blocco. Se qualcosa dovesse lanciare un'eccezione non rilevata siamo in grado di catturare e visualizzare un bel messaggio di errore per l'utente finale.
Il nostro primo compito all'interno del try {} catch {} è di indirizzare la nostra richiesta, che cosa l'utente vuole vedere? Qui ho implementato un codice dimostrazione molto semplice dove posso controllare il valore della 'pagina' ottenere variabile. Il tuo percorso può essere molto molto più complessa. Il routing viene utilizzato per chiamare ciò che mai codice deve essere eseguito per ottenere / trattare i dati forniti dall'utente e dire al sistema ciò che vista (e forse layout script) da utilizzare.
In definitiva se il nostro router non corrisponde ad alcuna pagina si imposta un codice di risposta 404 e mostra una bella pagina non trovata messaggio per l'utente finale. Qui, buttiamo e cattura la nostra eccezione proprio (e una eccezione molto generica a quella), ma probabilmente sareste gettando l'eccezione proprio dall'interno del codice router.
Una volta che abbiamo indirizzato con successo la nostra richiesta possiamo cominciare a fare qualcosa con il codice. Potrebbe essere che hai il tuo controller proprio / modelli attuate o si include un codice che è già stato in qualche modo separate. Qui ho fissato un paio di semplici variabili per l'oggetto di visualizzazione.
Una volta completata semplicemente rendere il punto di vista con i nostri dati. Se il codice genera un'eccezione non rilevata per qualsiasi motivo, questo è intrappolata vicino al fondo dello script. Qui abbiamo già chiaro uscita tamponata, insieme a 500 header di risposta, e dire la nostra applicazione per il rendering dello script visualizzare il 'errore' (che generalmente è una versione molto alleggerita del layout normale / vista e registra l'errore per la verifica successiva).
Poiché la vista è resa prima e iniettato nel layout, è possibile modificare il layout da dentro vista, e anzi set extra richiesti, per esempio,
- Titolo della pagina
- Meta tag
- Script (URL o codice) nella sezione <head>
- Aggiungere stili aggiuntivi, etc
Inoltre, la sua possibile anche modificare l'intero layout dalla visualizzazione utilizzando ...
layout () <php $ this-?> -> setLayout ('alternativeLayout')>? ... Come e quando richiesto.
Infine ...
Spero che questa sia stata un'utile introduzione alle Zend_Layout e Zend_View e vi permetterà di iniziare ad attuare il tuo MVC propri di base e migliorare la maintainibility / estendibilità del codice. Si prega di dare un'occhiata al codice sorgente per esempi di utilizzo (vedi il file README per le istruzioni).
Il codice si presuppone che hai già autoloading di lavoro (o di aver incluso le classi richieste). Inoltre, non mi consiglia di implementare il routing o dati di impostazione, come sopra, questo è molto semplificata per la dimostrazione. Per vedere il codice completo un'occhiata al codice sorgente collegata nella parte superiore di questo articolo.
Zend Framework versione: 1.10.6


















































Ben scritto e più informativo, grazie!