Nu Zend_Layout i Zend_View
En aquest article em veig en l'ús de Zend_Layout i Zend_View juntament amb un controlador frontal simple de mostrar com és possible començar a separar la lògica de negoci i la presentació de l'aplicació. Tot el codi està disponible a GitHub:
Nu Zend_Layout i Zend_View en GitHub .
MVC
Un comú patró de disseny per a aplicacions web modernes és el patró MVC. El Zend Framework 'en' mode de pila complet és una implementació de MVC en PHP i consta de tres parts:
- Model (M)
- Veure (V)
- Controlador (C)
El model està dissenyat de manera que les empreses i la lògica de presentació estan completament separats uns dels altres (amb la lògica de negoci en el model, i la presentació a la vista) i el controlador de sessió en el centre la realització de la "orquestra".
Presentació i Lògica
En el Zend Framework, la vista és manejat per dos components principals: Zend_View i Zend_Layout. Zend_Layout com el seu nom indica s'ocupa dels aspectes de disseny del lloc (en general, capçaleres, peus de pàgina, barres laterals, etc.) Zend_View se centra en la presentació de les dades que el model ha estat treballant per produir o derivar.
Com desenvolupadors, i les seves aplicacions, evolució que tendeixen a moure's a través de diverses etapes, en general cada una millora en la capacitat de manteniment anteriors, la millora i ampliació. Un dels principals problemes és que la presentació i la lògica encara aconseguir barregen i no és fàcil de començar a separar els dos.
Què hi ha de dolent en barrejar els dos?
Hi ha diverses raons per les barrejant diferents components de l'aplicació, per exemple, un dissenyador que treballa en el seu lloc no pot voler (o tenen el coneixement) per explorar tot en el codi tractant d'esbrinar on realitzar canvis en la presentació. De la mateixa manera un desenvolupador (si ets com jo que té la capacitat de concepció d'un estruç) es pot trencar una suor freda quan es parla de disseny o en el treball de IU.
A més què passa si més tard li agradaria presentar els seus llocs en diferents mitjans, com ara telèfons mòbils, Tablet PC, o exposar les dades a través de serveis web (XML / JSON / etc)? Després d'haver barrejat la presentació i la lògica que estan gairebé sense esperança, sense alguns hacks molt lleig per tirar de la presentació "del seu codi, abans d'injectar alguna cosa nova. Si les dades i la presentació s'ha separat de realitzar aquests canvis són gairebé trivial, crear un script de vista nou per al nou format i sol.licituds directes, segons correspongui.
La separació dels dos
En una aplicació de la seva evolució no sempre és econòmic per començar a aplicar una solució completa de MVC i l'aplicació ha de ser migrat a poc a poc - a vegades l'execució de codi antic en paral.lel amb les noves. És el millor que hi ha masses de la lògica (com la configuració de base de dades de connexió, l'autenticació, administració de galetes, etc) que no estan preparats per al modelat a la configuració dels marcs triats, per tant el codi antic i conegut-a-ser-treball pot seguir sent utilitzats fins el moment en que pot tornar a escriure / redissenyat.
Nota: Zend_Layout Ús i Zend_View d'aquest tipus és perfectament acceptable en el marc del paisatge Zend i el marc ha estat dissenyat de manera que els components individuals poden ser utilitzats sense la resta del marc. Un gran avantatge en aplicacions d'evolució i, probablement, una de les raons principals per la seva elevada ingesta d'aplicacions empresarials.
Front Controller
A continuació crear un controlador frontal - un únic arxiu dissenyat per recollir totes les sol licituds que no s'adapten a un arxiu en el sistema d'arxius. Això es realitza generalment mitjançant un arxiu htaccess. Com ara l'utilitzat per defecte en el Zend Framework instal lació. Al controlador frontal que s'ajusti a la nostra disposició i veure i que mostra que les diferents parts del full de sol licitud en el mateix.
define ('APP_PATH, dirname (FILE ).'/..'); / / Inici de memòria intermèdia de sortida ob_start (); / / Crea una instància de Zend_View Zend_Layout:: startMvc (); $ Layout = Zend_Layout:: getMvcInstance (); $ Layout-> setLayoutPath (APP_PATH. / Layout / scripts ') - SetViewSuffix> ('phtml') - SetLayout> ('index'); $ View = $ getView disseny-> () - SetScriptPath> (APP_PATH "/ veure / scripts.) - AddHelperPath> (. APP_PATH "biblioteca / / Zend / Veure / Ajudant ',' Zend_View_Helper '); / / Definir URL Base - ok * gairebé * nua, però no ho necessito! Zend_Controller_Front:: getInstance () -> setBaseUrl ($ ['HTTP_HOST'] _SERVER); try { / ** * Realitza alguna aplicació d'enrutament ... * - Podria estar usant això com un controlador frontal i dirigir totes les sol licituds * A través d'aquest arxiu d'un (a condició de fitxer no existeix en el sistema d'arxius * - Tingueu en compte el mètode a continuació és només veritat per a la demostració, seria * Horrible amb un lloc gran * / switch ($ ['page'] _GET) { cas "índex": cas de "excepció": pagename = $ $ ['page'] _GET; break; per defecte: $ Pagename = false; break; } / / No Exemple d'una pàgina que es troba ... if (falsa === $ pagename) { $ ResponseHeader = "HTTP/1.1 404 Pàgina no trobada"; throw new Exception ("Pàgina no trobada"); } / ** * Afegeix dades a la vista d'objectes aquí * Vostè pot tenir el seu propi controlador o aplicació inclou alguns arxius * On la lògica de negoci es deu en part separada de la lògica de vista * / displayText $ view-> = 'Hola de Lloyd'; buttonText $ view-> = 'I \' m no activa '!; ("Phtml {$ pagename}.") $ Esquema de contingut> = fer $ view->; fan ressò de $ layout-> (); } Catch (Exception $ i) { / / Neteja que ja estigui emmagatzemat el contingut - no volem mostrar això! ob_clean (); if (! isset ($ responseHeader)) { $ ResponseHeader = "HTTP/1.1 500 Error intern del servidor '; } capçalera ($ responseHeader); excepció $ view-> = $ i; $ Layout-> contingut = $ donar vista-> ('error.phtml'); fan ressò de $ layout-> (); }
En primer lloc vam començar buffers de sortida, en fer això podem establir les nostres capçaleres en qualsevol moment de la sol licitud i sé que és possible per enviar-los. En cas d'una excepció siguin llançats en qualsevol etapa de l'execució de codi que neteja el buffer i escriure o contingut del missatge d'error i el disseny. Això assegura que no lliurem part prestats contingut amb errors a l'usuari final.
A continuació una nova instància de MVC de Zend_Layout es genera i l'hi dic que té el disseny de seqüència phtml extensió, es troben en un directori fora de la ruta d'accés públic, i que el nostre disseny predeterminat es diu índex (. Phtml). Des del disseny que a continuació, extreure l'objecte de vista (a la qual ens vam posar les nostres dades per a ser presentats) i s'apliquen de configuració similar.
A continuació configurar l'objecte de vista amb una referència als ajudants per defecte Zend_View. Veure els ajudants són un conjunt de funcionalitats més comoditat. Per exemple, escriure un flotador en forma monetària, o la creació d'una taula de ratlles de zebra (que pot ser llegit aquí ). A l'estendre Zend_View_Helper_Abstract i afegint la seva pròpia biblioteca en aquest moment la seva possible utilitzar-ne un vostre vista d'aplicació.
La resta del codi de l'aplicació ja està embolicat en un try {} catch {} bloc. Si alguna cosa produeix una excepció no capturada podem capturar i mostrar un missatge d'error agradable per l'usuari final.
La nostra primera tasca en la captura try {} {} és la ruta sol.licitud, el que fa que l'usuari vol veure? Aquí he implementat un codi de demostració molt simple en el de comprovar el valor de la 'pàgina' obtenir la variable. La seva ruta pot ser molt més complexa. La ruta s'utilitza per cridar al que cada vegada el codi ha de ser executat per obtenir / manejar les dades proporcionades per l'usuari i per indicar al sistema que veure (i possiblement seqüència de disseny) per al seu ús.
En última instància, si el nostre router no coincideix amb cap pàgina que estableix un codi de resposta 404 i mostra una bona pàgina no trobada missatge a l'usuari final. En aquest sentit, llançar i agafar la nostra pròpia excepció (i una excepció molt genèrics en això), però probablement s'estaria llançant la seva pròpia excepció des del codi del router.
Un cop hem encaminat amb èxit la nostra petició, podem començar a fer alguna cosa amb el codi. Pot ser que vostè té els seus propis controladors / models implementats o que inclouen un codi que ja s'ha separat una mica. Aquí em vaig posar un parell de variables senzilles per a l'objecte de vista.
Quan s'acabi això, simplement fer que els punts de vista amb les nostres dades. Si el codi produeix una excepció no capturada per alguna raó aquest és atrapat a prop de la part inferior de la seqüència de comandaments. Aquí tenim clar que ja estigui emmagatzemat de sortida, defineixi un encapçalament de resposta de 500, i dir-li a la nostra aplicació per fer el guió de la 'error' de vista (que normalment serà una versió molt simplificada de la distribució normal / veure i registra l'error per a comprovar més tard).
Com es representa l'opinió de primera i s'injecta en el disseny es pot canviar el disseny des del punt de vista, i de fet estableix els extres necessaris, per exemple,
- Títol de la pàgina
- Meta etiquetes
- Seqüències d'ordres (URL o el codi) a la secció de <head>
- Afegir estils addicionals, etc
A més de la seva possible canviar tot el disseny des del punt de vista mitjançant l'ús de ...
esquema () <php $ this-?> -> setLayout ('alternativeLayout')>? ... Quan sigui necessari.
Finalment ...
Espero que això hagi estat una útil introducció a Zend_Layout i Zend_View i li permetrà començar a aplicar el MVC propis de base i millorar la maintainibility / extensibilitat del codi. Si us plau, doneu un cop d'ull al codi font d'exemples d'ús (vegeu l'arxiu README per obtenir instruccions).
El codi es suposa que ja tens la càrrega automàtica de treball (o que ha inclòs a les classes obligatòries). A més, jo no recomanaria que implementi la ruta o les dades de configuració que l'anterior, això és molt simplificat per a la demostració. Per veure el codi complet de fer una ullada al codi font vinculada al principi d'aquest article.
Zend Framework: 1.10.6


















































Ben escrit i informatiu més, gràcies!