Atelierzf Mvc Plugins Action Helpers

download Atelierzf Mvc Plugins Action Helpers

of 14

Transcript of Atelierzf Mvc Plugins Action Helpers

  • 8/3/2019 Atelierzf Mvc Plugins Action Helpers

    1/14

    Atelier Zend Framework : MVC,

    les plugins et les aides d'action

    par Matthew Weier O'Phinney (Phly, boy, phly - the weblog andsite of Matthew Weier O'Phinney) (Blog) Julien Pauli (Tutoriels,

    article et confrences PHP et developpement web) (Blog)

    Date de publication : 10/07/2008

    Dernire mise jour :

    Le systme MVC de Zend Framework propose une architecture souple, matrialise entresautres par la possibilit de crer des plugins de contrleur frontal, et des aides d'action.Nous allons voir en quoi ces 2 entits sont utiles, leur fonctionnement, et leurs diffrences.Cet atelier est une traduction des articles de Matthew Weier O'Phinney, ils sont disponibles

    ici et l.

    http://devzone.zend.com/article/3372-Front-Controller-Plugins-in-Zend-Frameworkhttp://devzone.zend.com/article/3350-Action-Helpers-in-Zend-Frameworkhttp://blog.developpez.com/index.php?blog=126http://julien-pauli.developpez.com/http://julien-pauli.developpez.com/http://developpez.net/forums/member.php?u=99082http://weierophinney.net/matthew/http://weierophinney.net/matthew/http://weierophinney.net/matthew/http://weierophinney.net/matthew/http://www.developpez.com/
  • 8/3/2019 Atelierzf Mvc Plugins Action Helpers

    2/14

    Atelier Zend Framework : MVC, les plugins et les aides d'action par Matthew Weier O'Phinney (Phly, boy, phly - the weblog and

    site of Matthew Weier O'Phinney) (Blog) Julien Pauli (Tutoriels, article et confrences PHP et developpement web) (Blog)

    - 2 -Copyright 2008 - Julien Pauli. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes,documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 Ede dommages et intrts.

    http://julien-pauli.developpez.com/tutoriels/zend-framework/atelier/mvc-plugins-actionhelpers/

    I - Les aides d'action (ActionHelpers).........................................................................................................................3I-A - Les bases................................................................................................................................ ...................... 3I-B - La mthode direct()....................................................................................................................................... 3I-C - La gestion des vnements.......................................................................................................................... 4I-D - Enregistrer des aides dans le gestionnaire...................................................................................................4I-E - Rcuprer statiquement des aides du gestionnaire......................................................................................5

    I-F - Crer votre propre aide................................................................................................................................. 5II - Les plugins de contrleur frontal (FrontController Plugins)...................................................................................8

    II-A - Dfinition....................................................................................................................................................... 8II-B - Enregistrer et rcuprer un plugin avec le contrleur frontal....................................................................... 8II-C - Les plugins internes pr-enregistrs............................................................................................................ 9II-D - Exemples d'utilisation de plugins................................................................................................................. 9

    II-D-1 - Plugin d'initialisation de MVC.............................................................................................................. 9II-D-2 - Plugin de gestion de cache............................................................................................................... 10II-E - Utiliser plusieurs actions (forward)........................................................................................................12

    III - Conclusion.......................................................................................................................................................... 14

    http://julien-pauli.developpez.com/tutoriels/zend-framework/atelier/mvc-plugins-actionhelpers/http://julien-pauli.developpez.com/tutoriels/zend-framework/atelier/mvc-plugins-actionhelpers/http://julien-pauli.developpez.com/tutoriels/zend-framework/atelier/mvc-plugins-actionhelpers/http://blog.developpez.com/index.php?blog=126http://julien-pauli.developpez.com/http://developpez.net/forums/member.php?u=99082http://weierophinney.net/matthew/http://weierophinney.net/matthew/http://weierophinney.net/matthew/http://weierophinney.net/matthew/http://www.developpez.com/
  • 8/3/2019 Atelierzf Mvc Plugins Action Helpers

    3/14

    Atelier Zend Framework : MVC, les plugins et les aides d'action par Matthew Weier O'Phinney (Phly, boy, phly - the weblog and

    site of Matthew Weier O'Phinney) (Blog) Julien Pauli (Tutoriels, article et confrences PHP et developpement web) (Blog)

    - 3 -Copyright 2008 - Julien Pauli. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes,documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 Ede dommages et intrts.

    http://julien-pauli.developpez.com/tutoriels/zend-framework/atelier/mvc-plugins-actionhelpers/

    I - Les aides d'action (ActionHelpers)

    Les aides d'action sont souvent considres comme des "fonctions de pro", et sont ainsi souvent boudes.Cependant, leur but est d'tendre les fonctionnalits du contrleur d'action (Zend_Controller_Action), sans pourautant devoir driver cette classe importante, par hritage. Nous allons voir comment les aides d'action fonctionnent,

    comment les crer et les utiliser notre avantage.

    I-A - Les bases

    On peut voir dans certains tutoriels, des rajouts de fonctions aux actions, par une mthode d'hritage :

    Redfinition de la classe d'action principale

    /**

    * Vos contrleurs d'action tendraient My_Controller_Action

    */

    abstractclass My_Controller_Action extends Zend_Controller_Action

    {

    // Ici, nos mthodes pratiques personnalises ...

    }

    Ceci est possible, mais est trs souvent une solution bancale, dans la mesure o il est trs rare que toutes vos actionsaient besoin de toutes les fonctionnalits ajoutes par hritage.Souvent, seule une partie des mthodes ajoutes va servir pour certains contrleurs, alors qu'une autre partie servirapour d'autres contrleurs ; cependant, tous les contrleurs hritent de toutes les mthodes...La solution : utiliser des aides d'action. Leur rle est de permettre un ajout de fonctionnalits prcises, pour descontrleurs prcis, parmi le lot. Ainsi, les aides d'actions ne sont charges qu' leur utilisation, et non en permanence.

    Les aides d'actions sont encapsules dans un gestionnaire d'aide, matrialis par la classe

    Zend_Controller_Action_HelperBroker. Cette classe sert de registre permanent, et de fabrique, afin de charger

    les aides la demande.Par dfaut, l'attribut $_helperde la classe Zend_Controller_Action contient une instance du gestionnaire d'aides.Lorsque nous utilisons une aide, le gestionnaire lui passe l'instance du contrleur d'action actuel, et l' aide peut doncintragir avec celui-ci. Ainsi, l'aide peut appeler des mthodes publiques du contrleur d'action (ou accder sesattributs publics), et inversement.

    En rgle gnrale, nous appelons notre aide en utilisant la dernire partie du nom de la classe la reprsentant. Parexemple, une aide dont la classe est 'Foo_Helper_Bar', s'appelle par 'bar'. Pour la rcuprer, nous passons soit parune proprit de la classe d'action, soit via sa mthode getHelper() :

    rcupration d'une aide d'action

    $bar=$this->_helper->bar;$bar=$this->_helper->getHelper('bar');

    C'est bien, mais il est possible de faire plus que a.

    I-B - La mthode direct()

    Les aides d'action utilisent le design pattern Stratgie (Strategy). Si nous dfinissons une mthode direct()dansnotre classe d'aide, alors on peut appeller celle-ci comme une mthode de la classe d'action principale.Par exemple, l'aide d'action "url", qui retourne une URL en se basant sur ses paramtres, s'appelle comme ceci :

    pattern strategy et mthode direct()$url=$this->_helper->url('bar','foo');// "/foo/bar"

    http://julien-pauli.developpez.com/tutoriels/zend-framework/atelier/mvc-plugins-actionhelpers/http://dico.developpez.com/html/3115-Conception-Abstract-Factory.phphttp://dico.developpez.com/html/1574-Conception-design-pattern.phphttp://dico.developpez.com/html/3115-Conception-Abstract-Factory.phphttp://julien-pauli.developpez.com/tutoriels/zend-framework/atelier/mvc-plugins-actionhelpers/http://blog.developpez.com/index.php?blog=126http://julien-pauli.developpez.com/http://developpez.net/forums/member.php?u=99082http://weierophinney.net/matthew/http://weierophinney.net/matthew/http://weierophinney.net/matthew/http://weierophinney.net/matthew/http://www.developpez.com/
  • 8/3/2019 Atelierzf Mvc Plugins Action Helpers

    4/14

    Atelier Zend Framework : MVC, les plugins et les aides d'action par Matthew Weier O'Phinney (Phly, boy, phly - the weblog and

    site of Matthew Weier O'Phinney) (Blog) Julien Pauli (Tutoriels, article et confrences PHP et developpement web) (Blog)

    - 4 -Copyright 2008 - Julien Pauli. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes,documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 Ede dommages et intrts.

    http://julien-pauli.developpez.com/tutoriels/zend-framework/atelier/mvc-plugins-actionhelpers/

    Utiliser la mthode direct() dans l'aide permet donc un appel 'virtuel' direct celle-ci depuis la classe d'actionprincipale : trs pratique.

    I-C - La gestion des vnements

    Comme si cela n'tait pas suffisant, les aides d'action possdent des mthodes dites vnementielles, qui permettentl'automatisation de certaines tches. Voici ces 3 vnements :

    init(): appele lorsque le contrleur d'action est initialis (seulement si une instance de l'aide existe dans legestionnaire)

    preDispatch(): appele aprs la routine de preDispatch() des plugins, mais avant la routine preDispatch() del'action actuelle, et seulement si une instance de l'aide existe dans le gestionnaire.

    postDispatch(): appele aprs la routine de postDispatch() des plugins, mais avant la routine postDispatch()de l'action actuelle, et seulement si une instance de l'aide existe dans le gestionnaire.

    "Seulement si une instance de l'aide existe dans le gestionnaire" : les appels se font donc la demande, sur lesaides enregistres dans le gestionnaire.

    Prenons titre d'exemple l'aide ViewRenderer, qui est active par dfaut dans Zend Framework, elle utilise lesvnements suivants :

    1 init(): L'aide initialise un objet de vue, configure le script de vue rendre, les chemins vers les aides et lesfiltres de vue, et enregistre l'objet vue comme proprit "view" dans l'action actuelle.

    2 postDispatch(): determine si une vue doit tre rendue, et si c'est le cas, rend la bonne vue en fonction del'action appele, dans le segment de rponse appropri.

    Un autre exemple : nous pourrions utiliser l'vnement preDispatch() dans une aide quelconque pour vrifier unattribut public du contrleur d'action actuel afin de dterminer quelle action requiert une authentification, et ainsirediriger vers un formulaire de login appropri le cas chant. C'est mieux qu'un plugin (voir aprs), car l'aide agiraituniquement sur l'action actuelle.

    I-D - Enregistrer des aides dans le gestionnaire

    Si vous voulez utiliser les vnements sur vos aides d'action, il faut pouvoir les enregistrer dans le gestionnaired'aides, assez tt, typiquement en chargement (bootstrap), ou dans un plugin (tt). Pour cela, agissez comme suit :

    enregistrement d'une aide d'action dans le gestionnaire

    Zend_Controller_Action_HelperBroker ::addHelper( new Foo_Helper_Bar() );

    Aussi, vous pouvez spcifier au gestionnaire un prfixe de classe, il saura alors trouver les aides de lui-mme :

    // Par prfixe de classe:

    Zend_Controller_Action_HelperBroker ::addPrefix('Foo_Helper');

    // Si les classes ne sont pas dans l'include_path, spcifiez un chemin en plus du prfixe :

    Zend_Controller_Action_HelperBroker ::addPath($path,'Foo_Helper');

    Ajouter un chemin ou un prfixe ne fait que dire au gestionnaire o se trouvent les classes d'aide, il ne va pas lesinstancier.Si vous avez instanci manuellement une aide avant le dispatching, vous devrez alors la passer au gestionnairepour qu'elle soit enregistre dans les actions futures, ou alors demander au gestionnaire de vous retourner une aidespcifique en l'instanciant, par la mme occasion.

    http://julien-pauli.developpez.com/tutoriels/zend-framework/atelier/mvc-plugins-actionhelpers/http://julien-pauli.developpez.com/tutoriels/zend-framework/atelier/mvc-plugins-actionhelpers/http://blog.developpez.com/index.php?blog=126http://julien-pauli.developpez.com/http://developpez.net/forums/member.php?u=99082http://weierophinney.net/matthew/http://weierophinney.net/matthew/http://weierophinney.net/matthew/http://weierophinney.net/matthew/http://www.developpez.com/
  • 8/3/2019 Atelierzf Mvc Plugins Action Helpers

    5/14

    Atelier Zend Framework : MVC, les plugins et les aides d'action par Matthew Weier O'Phinney (Phly, boy, phly - the weblog and

    site of Matthew Weier O'Phinney) (Blog) Julien Pauli (Tutoriels, article et confrences PHP et developpement web) (Blog)

    - 5 -Copyright 2008 - Julien Pauli. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes,documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 Ede dommages et intrts.

    http://julien-pauli.developpez.com/tutoriels/zend-framework/atelier/mvc-plugins-actionhelpers/

    I-E - Rcuprer statiquement des aides du gestionnaire

    Il arrivera quelques fois de vouloir rcuprer une instance d'une aide d'action, afin de la configurer ou de l'analyser.Plutt que de l'instancier nous-mme, nous pouvons demander au gestionnaire d'aides de crer l'instance et de nousla retourner. getStaticHelper()est la mthode qu'il nous faut.

    Un exemple : l'aide d'action ViewRenderer. Il est souvent utile de la rcuprer pour la configurer, par exemple luipasser les chemins des aides de vue par dfaut. Procdons ainsi comme ceci :

    rcupration d'une aide depuis le gestionnaire

    $viewRenderer= Zend_Controller_Action_HelperBroker ::getStaticHelper('ViewRenderer');

    $viewRenderer->initView();// assurons nous que l'objet de vue est bien initialis

    $viewRenderer->view->addHelperPath($path);// ajoutons un chemin vers les aides de vue.

    Le gestionnaire d'aide va alors instancier l'objet de l'aide s'il n'existait pas, et le retourner dans le cas contraire. Ils'agit ainsi de la mme instance.

    I-F - Crer votre propre aide

    Maintenant que nous en savons plus sur les aides d'action, passons la pratique. Imaginons des contrleurs quiutilisent un ou plusieurs formulaires. De mme, un formulaire peut tre utilis dans plusieurs contrleurs d'action.Nous allons crer une aide d'action qui va permettre de rcuprer un formulaire par nom de classe.Nous allons supposer que les formulaires sont stocks dans un dossier 'forms', juste sous le module en cours.Aussi, les noms de formulaires auront un espace de noms relatif au module en cours, sauf s'il s'agit du module pardfaut, ajout l'espace de noms 'Form_'. Par exemple dans un module 'news', les formulaires auront l'espace denom 'News_Form_'. La dernire partie de l'espace de nommage sera simplement le nom du formulaire tel que nousl'appellerons.Nous utiliserons pour cela la mthode direct(), l'aide d'action n'a qu'une chose faire : charger le formulaire et leretourner, la mthode direct()est donc parfaite cet effet.

    notre aide d'action chargeant des formulaires

    /**

    * Aide d'action de chargement de formulaires

    *

    * @uses Zend_Controller_Action_Helper_Abstract

    */

    class My_Helper_FormLoader extends Zend_Controller_Action_Helper_Abstract

    {

    /**

    * @var Zend_Loader_PluginLoader

    */

    public$pluginLoader;

    /**

    * Constructeur: initialisee le chargeur de classes d'aides ou plugins

    *

    * @return void

    */

    publicfunction__construct()

    {

    $this->pluginLoader=new Zend_Loader_PluginLoader();

    }

    /**

    * Charge le formulaire avec les options passes

    *

    * @param string$name

    * @param array|Zend_Config $options

    * @return Zend_Form*/

    publicfunction loadForm($name,$options=null)

    http://julien-pauli.developpez.com/tutoriels/zend-framework/atelier/mvc-plugins-actionhelpers/http://julien-pauli.developpez.com/tutoriels/zend-framework/atelier/mvc-plugins-actionhelpers/http://blog.developpez.com/index.php?blog=126http://julien-pauli.developpez.com/http://developpez.net/forums/member.php?u=99082http://weierophinney.net/matthew/http://weierophinney.net/matthew/http://weierophinney.net/matthew/http://weierophinney.net/matthew/http://www.developpez.com/
  • 8/3/2019 Atelierzf Mvc Plugins Action Helpers

    6/14

    Atelier Zend Framework : MVC, les plugins et les aides d'action par Matthew Weier O'Phinney (Phly, boy, phly - the weblog and

    site of Matthew Weier O'Phinney) (Blog) Julien Pauli (Tutoriels, article et confrences PHP et developpement web) (Blog)

    - 6 -Copyright 2008 - Julien Pauli. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes,documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 Ede dommages et intrts.

    http://julien-pauli.developpez.com/tutoriels/zend-framework/atelier/mvc-plugins-actionhelpers/

    notre aide d'action chargeant des formulaires {

    $module =$this->getRequest()->getModuleName();

    $front =$this->getFrontController();

    $default=$front->getDispatcher()

    ->getDefaultModule();

    if (empty($module)) {

    $module=$default; }

    $moduleDirectory=$front->getControllerDirectory($module);

    $formsDirectory =dirname($moduleDirectory) .'/forms';

    $prefix= (('default'==$module) ?'':ucfirst($module) .'_')

    .'Form_';

    $this->pluginLoader->addPrefixPath($prefix,$formsDirectory);

    $name =ucfirst((string)$name);

    $formClass=$this->pluginLoader->load($name);

    returnnew$formClass($options);

    }

    /**

    * Strategy pattern: appelle l'aide comme mthode du contrleur d'action

    ** @param string$name

    * @param array|Zend_Config $options

    * @return Zend_Form

    */

    publicfunction direct($name,$options=null)

    {

    return$this->loadForm($name,$options);

    }

    }

    Ce code doit tre plac dans un fichier appel 'FormLoader.php', situ dans le dossier 'My/Helper/', lui-mme dansl'include_path.Bien, comment l'utiliser maintenant ? Imaginons que nous sommes dans le module par dfaut, et dans un contrleur

    d'action LoginController. Nous voulons charger le formulaire 'login'. Nous le nommerons 'Form_Login', et placeronssa classe dans 'forms/Login.php', dans le dossier de l'application :

    application/

    controllers/

    LoginController.php

    forms/

    Login.php - Contient la classe 'Form_Login'

    Dans notre code d'amorage (bootstrap), nous nous assureons que le gestionnaire d'aides d'action trouvera l'aideen question :

    Zend_Controller_Action_HelperBroker ::addPrefix('My_Helper');

    Puis enfin, dans notre contrleur LoginController, nous pouvons appeler le formulaire grce l'aide d'action :

    $loginForm=$this->_helper->formLoader('login');

    Beaucoup de travail pour si peu ? Du tout ! Aussi longtemps nous suivrons la rgle de nommage, nous pourronsappeller l'aide pour autant de formulaires que ncessaire.Si dans un contrleur UserController, nous voulons appeler un formulaire d'enregistrement, nous procderons ainsi :

    $regForm=$this->_helper->formLoader('registration');

    http://julien-pauli.developpez.com/tutoriels/zend-framework/atelier/mvc-plugins-actionhelpers/http://julien-pauli.developpez.com/tutoriels/zend-framework/atelier/mvc-plugins-actionhelpers/http://blog.developpez.com/index.php?blog=126http://julien-pauli.developpez.com/http://developpez.net/forums/member.php?u=99082http://weierophinney.net/matthew/http://weierophinney.net/matthew/http://weierophinney.net/matthew/http://weierophinney.net/matthew/http://www.developpez.com/
  • 8/3/2019 Atelierzf Mvc Plugins Action Helpers

    7/14

    Atelier Zend Framework : MVC, les plugins et les aides d'action par Matthew Weier O'Phinney (Phly, boy, phly - the weblog and

    site of Matthew Weier O'Phinney) (Blog) Julien Pauli (Tutoriels, article et confrences PHP et developpement web) (Blog)

    - 7 -Copyright 2008 - Julien Pauli. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes,documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 Ede dommages et intrts.

    http://julien-pauli.developpez.com/tutoriels/zend-framework/atelier/mvc-plugins-actionhelpers/

    De plus, une fois que le prfixe est cre et qu'il est enregistr dans le gestionnaire (par exemple 'My_Helper'), nouspouvons ajouter des aides dans le mme dossier, elles suivront la mme rgle de nommage, et le gestionnaire lestrouvera et les chargera.

    Il est clair que les aides d'action nous aident suivre le principe 'DRY' (Don't Repeat Yourself : n'crivez pas deuxfois une mme implmentation). Tout ce que nous pensons utiliser encore et encore, nous le dlguons une aide

    d'action, qui sera disponible pour tous les contrleurs d'action dispatchs.Aprs quelque temps, nous aurons un ensemble de fonctionnalits sous forme de classes, que nous pourrons alorsmigrer de projet en projet, sans devoir driver (hriter) la classe d'action principale.Flxibilit et extensibilit :-).

    http://julien-pauli.developpez.com/tutoriels/zend-framework/atelier/mvc-plugins-actionhelpers/http://julien-pauli.developpez.com/tutoriels/zend-framework/atelier/mvc-plugins-actionhelpers/http://julien-pauli.developpez.com/tutoriels/zend-framework/atelier/mvc-plugins-actionhelpers/http://blog.developpez.com/index.php?blog=126http://julien-pauli.developpez.com/http://developpez.net/forums/member.php?u=99082http://weierophinney.net/matthew/http://weierophinney.net/matthew/http://weierophinney.net/matthew/http://weierophinney.net/matthew/http://www.developpez.com/
  • 8/3/2019 Atelierzf Mvc Plugins Action Helpers

    8/14

    Atelier Zend Framework : MVC, les plugins et les aides d'action par Matthew Weier O'Phinney (Phly, boy, phly - the weblog and

    site of Matthew Weier O'Phinney) (Blog) Julien Pauli (Tutoriels, article et confrences PHP et developpement web) (Blog)

    - 8 -Copyright 2008 - Julien Pauli. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes,documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 Ede dommages et intrts.

    http://julien-pauli.developpez.com/tutoriels/zend-framework/atelier/mvc-plugins-actionhelpers/

    II - Les plugins de contrleur frontal (FrontController Plugins)

    Les plugins de contrleurs frontal (les plugins) servent tendre les capacits de l'application dans son ensemble.Comme les aides d'action, ils vitent ainsi de devoir driver des classes importantes, comme le contrleur frontalZend_Controller_Front.

    II-A - Dfinition

    Dans le Zend Framework, les plugins sont conus pour s'enregistrer et pour couter des vnements particuliers.Ces vnements sont remarquables et importants : le routage de la requte, la boucle de dispatching, le dispatchingd'une action... Les voici :

    1 routeStartup(): Avant le routage de la requte ;2 routeShutdown(): Aprs le routage de la requte ;3 dispatchLoopStartup(): Avant d'entrer dans la boucle de dispatching ;4 preDispatch(): Avant de dispatcher un contrleur d'action ;5 postDispatch(): Aprs avoir dispatch un contrleur d'action ;6 dispatchLoopShutdown(): Aprs la fin de la boucle de dispatching.

    On peut se poser une question lorsqu'on lit cette liste : "Pourquoi y a-t-il distinction entre la fin du routage et l'entredans la boucle de dispatching, alors que rien ne se passe entre les deux ?".En fait, c'est pour une question conceptuelle, smantique. Nous pourrions vouloir changer le routage juste aprscelui-ci, ou altrer le dispatcheur juste avant son rle (sa boucle). La smantique est diffrente, et avoir ainsi deuxvnements distincts permet d'y voir plus clair.Dans le mme genre : "Pourquoi existe-t-il des mthodes vnementielles dispatchLoopStartup/Shutdown() etpre/postDispatch()?". Tout simplement car nous pouvons mettre en avant la boucle de dispatching.Le routeur n'est appel qu'une seule fois, avant la boucle, alors qu' l'interieur de la boucle, plusieurs actions peuvents'enchaner, d'o l'importante distinction.

    Un plugin est une classe qui tend Zend_Controller_Plugin_Abstract. Cette classe abstraite dfinit des mthodesvides pour chacun des vnements. Un plugin devra donc redfinir certaines (ou toutes) de ces mthodes, et le codeutile y sera insr.Sauf pour dispatchLoopShutdown(), toutes les mthodes du plugin prennent en paramtre une variable $request,de type Zend_Controller_Request_Abstract (la classe de requte de base dans le MVC de ZF).

    publicfunction preDispatch(Zend_Controller_Request_Abstract $request)

    {

    }

    Il est donc possible de distinguer les plugins "qui agissent tt", sur les vnements routeStartup(), routeShutdown(),

    et dispatchLoopStartup(), soit avant l'entre en boucle de dispatching, avant toute action.Ces plugins auront donc un effet sur l'ensemble de l'application. Aussi, nous pouvons l'inverse distinguer lesplugins "qui agissent tard", sur les vnements postDispatch() et dispatchLoopShutdown(), qui agissent doncaprs qu'une (ou des) action ait t traite.

    II-B - Enregistrer et rcuprer un plugin avec le contrleur frontal

    Les classes de plugins doivent tre instancies, et passes au contrleur frontal, ceci se fait grce la mthodeZend_Controller_Front::registerPlugin() :

    enregistrement d'un plugin

    $front= Zend_Controller_Front::getInstance();

    $front->registerPlugin(new FooPlugin());

    http://julien-pauli.developpez.com/tutoriels/zend-framework/atelier/mvc-plugins-actionhelpers/http://julien-pauli.developpez.com/tutoriels/zend-framework/atelier/mvc-plugins-actionhelpers/http://blog.developpez.com/index.php?blog=126http://julien-pauli.developpez.com/http://developpez.net/forums/member.php?u=99082http://weierophinney.net/matthew/http://weierophinney.net/matthew/http://weierophinney.net/matthew/http://weierophinney.net/matthew/http://www.developpez.com/
  • 8/3/2019 Atelierzf Mvc Plugins Action Helpers

    9/14

    Atelier Zend Framework : MVC, les plugins et les aides d'action par Matthew Weier O'Phinney (Phly, boy, phly - the weblog and

    site of Matthew Weier O'Phinney) (Blog) Julien Pauli (Tutoriels, article et confrences PHP et developpement web) (Blog)

    - 9 -Copyright 2008 - Julien Pauli. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes,documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 Ede dommages et intrts.

    http://julien-pauli.developpez.com/tutoriels/zend-framework/atelier/mvc-plugins-actionhelpers/

    On peut enregistrer un plugin quand on le souhaite, simplement ils n'agiront qu'aprs leur enregistrement, en gnralnous les enregistrerons en bootstrap (configuration du systme MVC).En option, nous pouvons passer un numro pile aux plugins. Ceci permet de spcifier l'ordre dans lequel ils agiront,plus le chiffre est bas, plus tt le plugin agira (avant ses frres).

    $front->registerPlugin(new FooPlugin(),1); // agira tt$front->registerPlugin(new FooPlugin(),100);// agira tard

    Il peut quelquefois tre ncessaire de pouvoir rcuprer un plugin enregistr dans le contrleur frontal, pour leconfigurer aprs son enregistrement, par exemple. La mthode pour a est Zend_Controller_Front::getPlugin() :

    $front = Zend_Controller_Front::getInstance();

    $fooPlugin=$front->getPlugin('FooPlugin');

    II-C - Les plugins internes pr-enregistrs

    Maintenant que nous savons manipuler les plugins, voyons un peu quoi ils peuvent bien servir. Prenons ainsicomme exemple les plugins pr-existants dans le systme MVC de ZF :Zend_Layout :Zend_Layout peut tre utilise, de manire optionnelle, avec les composants MVC. Lorsqu'il est utilis, il ajoute unplugin (entre autres) dans le systme MVC. Celui-ci coute l'vnement postDispatch() et est enregistr dans lapile avec un numro trs lev, de manire ce qu'il intervienne aprs tous les autres plugins ventuels.Le plugin Layout permet alors un pattern "Two Step View" : il capture le contenu de la rponse et le passe l'objetLayout, de manire ce que ce contenu puisse tre rinject dans le script de vue layout.Error Handler :Ce plugin est enregistr et il coute l'vnement postDispatch(), lui aussi avec un numro lev de pile. Il analysela rponse afin de vrifier si une exception lui a t enregistre. Si c'est le cas, il rinjecte alors une autre requtedans le dispatcheur, une requte menant vers un contrleur et une action d'erreur, permettant ainsi de traiter les

    exceptions comme des erreurs.

    II-D - Exemples d'utilisation de plugins

    Pour donner d'autres ides, nous pourrions penser des plugins dont les rles pourraient tre :

    1 Initialisation de l'application ;2 Systme de cache ;3 Initialisation et personnalisation des routes ;4 Authentication et gestion d'ACLs ;5 Filtres de rendu final pour XHTML.

    Considrons notre premier exemple : initalisation de l'application. D'habitude, nous initialisons l'application dans lebootstrap, souvent appel "index.php". Cependant, ceci mne souvent des fichiers gros, lourds et peu commodes.De mme, il n'est alors pas possible de partager du code de ce fichier entre applications. Pourquoi ne pas dlguerune partie de la configuration un plugin ? Particulirement sur l'vnement routeStartup() :

    II-D-1 - Plugin d'initialisation de MVC

    /**

    * Plugin d'initialisation d'application

    *

    * @uses Zend_Controller_Plugin_Abstract

    */class My_Plugin_Initialization extends Zend_Controller_Plugin_Abstract

    {

    http://julien-pauli.developpez.com/tutoriels/zend-framework/atelier/mvc-plugins-actionhelpers/http://julien-pauli.developpez.com/tutoriels/zend-framework/atelier/mvc-plugins-actionhelpers/http://julien-pauli.developpez.com/tutoriels/zend-framework/atelier/mvc-plugins-actionhelpers/http://blog.developpez.com/index.php?blog=126http://julien-pauli.developpez.com/http://developpez.net/forums/member.php?u=99082http://weierophinney.net/matthew/http://weierophinney.net/matthew/http://weierophinney.net/matthew/http://weierophinney.net/matthew/http://www.developpez.com/
  • 8/3/2019 Atelierzf Mvc Plugins Action Helpers

    10/14

    Atelier Zend Framework : MVC, les plugins et les aides d'action par Matthew Weier O'Phinney (Phly, boy, phly - the weblog and

    site of Matthew Weier O'Phinney) (Blog) Julien Pauli (Tutoriels, article et confrences PHP et developpement web) (Blog)

    - 10 -Copyright 2008 - Julien Pauli. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes,documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 Ede dommages et intrts.

    http://julien-pauli.developpez.com/tutoriels/zend-framework/atelier/mvc-plugins-actionhelpers/

    /**

    * Constructeur

    *

    * @param string$env Execution environment

    * @return void

    */

    publicfunction__construct($env)

    {

    $this->setEnv($env);

    }

    /**

    * Evnement route startup

    *

    * @param Zend_Controller_Request_Abstract $request

    * @return void

    */

    publicfunction routeStartup(Zend_Controller_Request_Abstract $request)

    {

    $this->loadConfig()

    ->initView()

    ->initDb()

    ->setRoutes()

    ->setPlugins() ->setActionHelpers()

    ->setControllerDirectory();

    }

    // ...

    }

    Le fichier bootstrap pourra ressembler ceci :

    require_once'Zend/Loader.php';

    Zend_Loader::registerAutoload();

    $front= Zend_Controller_Front::getInstance();

    $front->registerPlugin(new My_Plugin_Initialization('production'));$front->dispatch();

    Les mthodes dcrites dans le plugin sont assez explicites. Nous voyons qu' prsent la boostrap est plus ar, etla gestion de la configuration sera partageable entre applications.La maintenabilit en est ainsi amliore.

    II-D-2 - Plugin de gestion de cache

    Souvent, les pages d'un site sont relativement statiques. Pourquoi ne pas crer un plugin bas sur Zend_Cache,qui va chercher dans le cache une page prcdemment intrroge, et la restaurer, plutt que de la recalculer ? Voiciles critres de notre exemple de cache :

    1 Configuration du cache passe au constructeur ;2 Seules les requtes GET seront caches ;3 Les redirections ne doivent pas tre caches ;4 N'importe quelle action doit pouvoir dire au cache qu'elle ne souhaite pas tre cache

    Ce plugin va se baser sur deux vnements. D'abord, le routage doit tre termin et la boucle de dispatching pasencore entamme, pour vrifier si la requte peut tre issue du cache, ou non.Ensuite, nous devons cacher lorsque nous sommes certains que toutes les actions sont termines.Les deux vnements appropris sont donc dispatchLoopStartup(), et dispatchLoopShutdown().

    /**

    * Caching plugin

    *

    http://julien-pauli.developpez.com/tutoriels/zend-framework/atelier/mvc-plugins-actionhelpers/http://julien-pauli.developpez.com/tutoriels/zend-framework/atelier/mvc-plugins-actionhelpers/http://blog.developpez.com/index.php?blog=126http://julien-pauli.developpez.com/http://developpez.net/forums/member.php?u=99082http://weierophinney.net/matthew/http://weierophinney.net/matthew/http://weierophinney.net/matthew/http://weierophinney.net/matthew/http://www.developpez.com/
  • 8/3/2019 Atelierzf Mvc Plugins Action Helpers

    11/14

    Atelier Zend Framework : MVC, les plugins et les aides d'action par Matthew Weier O'Phinney (Phly, boy, phly - the weblog and

    site of Matthew Weier O'Phinney) (Blog) Julien Pauli (Tutoriels, article et confrences PHP et developpement web) (Blog)

    - 11 -Copyright 2008 - Julien Pauli. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes,documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 Ede dommages et intrts.

    http://julien-pauli.developpez.com/tutoriels/zend-framework/atelier/mvc-plugins-actionhelpers/

    * @uses Zend_Controller_Plugin_Abstract

    */

    class My_Plugin_Caching extends Zend_Controller_Plugin_Abstract

    {

    /**

    * @varbool Dsactiver le cache ou non

    */

    publicstatic$doNotCache=false;

    /**

    * @var Zend_Cache_Frontend

    */

    public$cache;

    /**

    * @varstring Cl de cache

    */

    public$key;

    /**

    * Constructeur: initialise le cache

    *

    * @param array|Zend_Config $options

    * @return void* @throws Exception

    */

    publicfunction__construct($options)

    {

    if ($optionsinstanceof Zend_Config) {

    $options=$options->toArray();

    }

    if (!is_array($options)) {

    thrownewException('Invalid cache options; must be array or Zend_Config object');

    }

    if

    (array('frontend','backend','frontendOptions','backendOptions') !=array_keys($options)) {

    thrownewException('Invalid cache options provided');

    }

    $options['frontendOptions']['automatic_serialization']=true;

    $this->cache= Zend_Cache::factory(

    $options['frontend'],

    $options['backend'],

    $options['frontendOptions'],

    $options['backendOptions']

    );

    }

    /**

    * Dmarre le cache

    *

    * Determine si le cache peut tre charg (cache hit). Si c'est le cas, retourne le contenu du cache

    ** @param Zend_Controller_Request_Abstract $request

    * @return void

    */

    publicfunction dispatchLoopStartup(Zend_Controller_Request_Abstract $request)

    {

    if (!$request->isGet()) {

    self::$doNotCache=true;

    return;

    }

    $path=$request->getPathInfo();

    $this->key=md5($path);

    if (false!== ($response=$this->getCache())) {

    $response->sendResponse();

    exit;

    }

    http://julien-pauli.developpez.com/tutoriels/zend-framework/atelier/mvc-plugins-actionhelpers/http://julien-pauli.developpez.com/tutoriels/zend-framework/atelier/mvc-plugins-actionhelpers/http://blog.developpez.com/index.php?blog=126http://julien-pauli.developpez.com/http://developpez.net/forums/member.php?u=99082http://weierophinney.net/matthew/http://weierophinney.net/matthew/http://weierophinney.net/matthew/http://weierophinney.net/matthew/http://www.developpez.com/
  • 8/3/2019 Atelierzf Mvc Plugins Action Helpers

    12/14

    Atelier Zend Framework : MVC, les plugins et les aides d'action par Matthew Weier O'Phinney (Phly, boy, phly - the weblog and

    site of Matthew Weier O'Phinney) (Blog) Julien Pauli (Tutoriels, article et confrences PHP et developpement web) (Blog)

    - 12 -Copyright 2008 - Julien Pauli. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes,documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 Ede dommages et intrts.

    http://julien-pauli.developpez.com/tutoriels/zend-framework/atelier/mvc-plugins-actionhelpers/

    }

    /**

    * Enregistre le cache

    *

    * @return void

    */

    publicfunction dispatchLoopShutdown()

    {

    if (self::$doNotCache

    ||$this->getResponse()->isRedirect()

    || (null===$this->key)

    ) {

    return;

    }

    $this->cache->save($this->getResponse(),$this->key);

    }

    publicfunction getCache()

    {

    if( ($response=$this->cache->load($this->key)) !=false) {

    return$response;

    } returnfalse;

    }

    }

    Pendant dispatchLoopStartup(), le plugin effecture plusieurs traitements. D'abord, il vrifie les pr-conditions :avons nous une requte GET ? Si c'est le cas, il va crer une cl de cache base sur l'URI de la requte, et vrifie sicette cl est en cache et si elle peut tre charge (cache hit). Si c'est le cas, il sert alors la rponse depuis le cache.Dans dispatchLoopShutdown(), nous faisons en sorte de regarder si l'action n'a pas indiqu qu'elle ne voulait pastre cache, si ce n'est pas une redirection ou si nous ne pouvons calculer la cl. Dans tous les autres cas, nouscrons un cache de la rponse cette requte.

    Comment dire de ne pas mettre en cache telle ou telle requte ? L'attribut statique $doNotCacheest l pour cela :

    Ne pas cacher

    My_Plugin_Caching::$doNotCache=true;

    Ceci supprime le mcanisme de cache pour la requte HTTP en cours.

    Pourquoi avoir utilis dispatchLoopStartup() plutt que routeStartup() ? Et bien parce que le cache joue avecl'objet de requte, or celui-ci est altr par le processus de routage.Si plus tard, nous voulions modifier le calcul de la cl de cache, ou ne pas cacher certaines routes mais d'autres,certains modules / actions / contrleurs ... Nous aurions besoin du processus de routage pour tout ceci.Cependant, cet exemple est simple et l juste pour montrer comment utiliser les diffrents vnements des plugins.

    II-E - Utiliser plusieurs actions (forward)

    Comment dire une action qu'elle doit tre suivie d'une autre ? Dans une action, comment savoir si une action vasuivre ?La rponse se situe dans l'information isDispatchedde l'objet de requte. Lorsque ce drapeau est mis false, celasignifie que la requte actuelle n'a pas encore t traite. Typiquement, c'est ce que fait la mthode _forward()ducontrleur d'action. En d'autre termes, une requte avec un drapeau isDispatched false, est une nouvelle requteque le contrleur frontal va injecter dans le processus de dispatching.

    Ainsi, pour dispatcher une autre action, il faut simplement changer ce drapeau de valeur.

    http://julien-pauli.developpez.com/tutoriels/zend-framework/atelier/mvc-plugins-actionhelpers/http://julien-pauli.developpez.com/tutoriels/zend-framework/atelier/mvc-plugins-actionhelpers/http://blog.developpez.com/index.php?blog=126http://julien-pauli.developpez.com/http://developpez.net/forums/member.php?u=99082http://weierophinney.net/matthew/http://weierophinney.net/matthew/http://weierophinney.net/matthew/http://weierophinney.net/matthew/http://www.developpez.com/
  • 8/3/2019 Atelierzf Mvc Plugins Action Helpers

    13/14

    Atelier Zend Framework : MVC, les plugins et les aides d'action par Matthew Weier O'Phinney (Phly, boy, phly - the weblog and

    site of Matthew Weier O'Phinney) (Blog) Julien Pauli (Tutoriels, article et confrences PHP et developpement web) (Blog)

    - 13 -Copyright 2008 - Julien Pauli. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes,documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 Ede dommages et intrts.

    http://julien-pauli.developpez.com/tutoriels/zend-framework/atelier/mvc-plugins-actionhelpers/

    Par exemple, pour aiguiller une action sur SearchController::formAction(), il faut procder comme suit :

    $request->setModuleName('default')

    ->setControllerName('search'))

    ->setActionName('form')

    ->setDispatched(false);

    }

    Pour vrifier si une action a t dispatche ou si elle est "fraiche" :

    if ($request->isDispatched()) {

    // La requte a dja t traite

    }else{

    // Nouvelle requte, pas encore traite (dispatche)

    }

    Vous pouvez regarder le couple plugin / aide d'actionActionStack. Son rle est justementde grer une pile d'actions. A chaque itration de la boucle de dispatching, le plugin va

    supprimer une action de la pile et en demander le dispatch.Il est donc possible de grer une pile d'actions qui s'enchanent.

    http://julien-pauli.developpez.com/tutoriels/zend-framework/atelier/mvc-plugins-actionhelpers/http://julien-pauli.developpez.com/tutoriels/zend-framework/atelier/mvc-plugins-actionhelpers/http://blog.developpez.com/index.php?blog=126http://julien-pauli.developpez.com/http://developpez.net/forums/member.php?u=99082http://weierophinney.net/matthew/http://weierophinney.net/matthew/http://weierophinney.net/matthew/http://weierophinney.net/matthew/http://www.developpez.com/
  • 8/3/2019 Atelierzf Mvc Plugins Action Helpers

    14/14

    Atelier Zend Framework : MVC, les plugins et les aides d'action par Matthew Weier O'Phinney (Phly, boy, phly - the weblog and

    site of Matthew Weier O'Phinney) (Blog) Julien Pauli (Tutoriels, article et confrences PHP et developpement web) (Blog)

    - 14 -Copyright 2008 - Julien Pauli. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes,documents images etc sans l'autorisation expresse de l'auteur Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E

    III - Conclusion

    Question trs prise : dans quel cas utiliser un plugin, et dans quel cas utiliser une aide d'action ?C'est trs simple. Si la fonctionnalit dsire doit intragir d'une manire ou d'une autre avec l'action en cours dedispatching, il est prfrable d'utiliser une aide d'action. Par ailleurs, si la fonctionnalit ne doit tre active que pour

    certains modules / contrleurs ou actions, l encore, une aide d'action est plus approprie qu'un plugin.En revanche, si la fonctionnalit est relative l'application dans son ensemble (comme la gestion du cache parexemple), alors un plugin est mieux indiqu.

    Les plugins et les aides d'action rpondent des design patterns et des modles connus de dlagation deresponsabilit, ils sont dans la parfaite ligne du Zend Framework. Ils servent ajouter des fonctionnalits l'ensemble du modle MVC, tout en enlevant la tentation de devoir driver une classe (hritage) importante de cemodle (par exemple Zend_Controller_Front ou Zend_Controller_Action).Ainsi, il est trs simple d'ajouter une fonctionnalit, mais aussi de la retirer, temporairement, pour des tests parexemple, ce qui n'est par dfinition pas le cas de l'hritage.

    http://julien-pauli.developpez.com/tutoriels/zend-framework/atelier/mvc-plugins-actionhelpers/http://blog.developpez.com/index.php?blog=126http://julien-pauli.developpez.com/http://developpez.net/forums/member.php?u=99082http://weierophinney.net/matthew/http://weierophinney.net/matthew/http://weierophinney.net/matthew/http://weierophinney.net/matthew/http://www.developpez.com/