Mvc Controleur

Embed Size (px)

Citation preview

  • 8/2/2019 Mvc Controleur

    1/19

  • 8/2/2019 Mvc Controleur

    2/19

    Le modle MVC et le contrleur sous PHP parJulien Pauli (Tutoriels, article et confrences PHP et developpement web) (Blog)

    - 2 -Copyright 2007 - 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/php/mvc-controleur/

    I - Introduction..............................................................................................................................................................3II - Principe du modle MVC.......................................................................................................................................6III - Le frontController ou contrleur frontal.................................................................................................................9IV - Motif actionController..........................................................................................................................................14V - Conclusions..........................................................................................................................................................19

    http://julien-pauli.developpez.com/tutoriels/php/mvc-controleur/http://julien-pauli.developpez.com/tutoriels/php/mvc-controleur/http://julien-pauli.developpez.com/tutoriels/php/mvc-controleur/http://blog.developpez.com/index.php?blog=126http://julien-pauli.developpez.com/http://developpez.net/forums/member.php?u=99082http://www.developpez.com/
  • 8/2/2019 Mvc Controleur

    3/19

    Le modle MVC et le contrleur sous PHP parJulien Pauli (Tutoriels, article et confrences PHP et developpement web) (Blog)

    - 3 -Copyright 2007 - 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/php/mvc-controleur/

    I - Introduction

    Le MVC tout comme l'orientation objet du code, semble tre devenu un standard dans le developpementd'applications web, avec la rputation d'tre une bonne pratique de conception.Cependant, trouver une definition exacte et prcise du MVC semble impossible, notamment au regard de PHP,

    langage script interprt chaque requte, la diffrence de java avec qui on peut utiliser les threads et ole serveur web est spar du serveur d'application grant les objets, leur tat et leur persistance. De nombreux

    Frameworks utilisent aujourd'hui MVC, car le but principal de ce motif est de sparer les couches logiques d'uneapplication. Nous allons voir qu'il n'est pas toujours judicieux d'utiliser MVC, ce motif sera plutt rserv aux sitestouffus, dans lesquels beaucoup de redondances de code apparaissent en gnral, des sites souvent mis jour,souvent remodels. Dans le cadre d'une petite application web "gentillette" la complexit en terme de code, apportepar MVC, ne sera pas justifie. En revanche pour tout autre projet web, la sparation en plusieurs couches permet diffrentes quipes de travailler chacune sur une couche, indpendamment des autres.Et c'est aussi un gros avantage lorsqu'une couche doit voluer, sans que les autres n'en aient besoin.Voyons dj un petit code :

    a crit le

  • 8/2/2019 Mvc Controleur

    4/19

    Le modle MVC et le contrleur sous PHP parJulien Pauli (Tutoriels, article et confrences PHP et developpement web) (Blog)

    - 4 -Copyright 2007 - 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/php/mvc-controleur/

    C'est volontairement simple et simplifi, peu scuris, ceci pour demeurer concis et clair, constat : tout le mondeconnat un code comme celui-ci, et a ne choquera personne. PHP est mlang au sein du HTML, aprs tout c'estson but premier : langage prprocesseur.A la lecture du code, on comprend immdiatement ce quoi il est destin, c'est l'avantage. On appelle a un traitementprocdural. L'inconvnient, c'est que les couches sont mlanges. Dans le traitement d'informations sur le web,gnralement on distingue 3 couches : le modle qui gre la manire d'accder aux donnes, la vue qui se charge

    de prsenter des donnes, et le contrle, c'est l'tape intermdiaire de slection et fusion des donnes. On peut doncfactoriser le code pour bien sparer ces 3 couches, voyez plutt :

    mymodel.php

  • 8/2/2019 Mvc Controleur

    5/19

    Le modle MVC et le contrleur sous PHP parJulien Pauli (Tutoriels, article et confrences PHP et developpement web) (Blog)

    - 5 -Copyright 2007 - 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/php/mvc-controleur/

    myview.php

    mycontroller.php

    Et voil, on a appliqu le modle MVC. On a bien spar le code en 3 couches distinctes, qui se connaissent l'unel'autre. Dans ce code-l, on peut facilement changer la manire d'accder aux donnes (changer de SGBD, parexemple), sans pour autant se soucier le moins du monde de la prsentation, ou de la manipulation future de cesdonnes. Remarquez aussi que nous n'avons pas utilis la programmation oriente objet.Voil l'intrt principal d'un modle MVC: sparer les couches de conception, de manire ce que plusieurs groupesde personnes puissent travailler chacun sur sa couche, sans mme qu'ils connaissent les personnes qui utilisent lacouche du dessous (ou du dessus, ou d' cot).

    Il n'est cependant pas toujours facile de bien distinguer les couches, et le motif MVC reste sans aucun doute un motifcomplexe car, nous allons le voir, on peut fortement le complexifier avec MVC2, mais les dveloppeurs habitus ce modle apprcient particulirement la lisibilit du code.3 couches sont un minimum, MVC2 en implmente minimum 4 et on peut mme en distinguer jusqu' 5 voire 6 ou plussur des gros projets. Mais comme toujours, la sparation des entits logiques, ralisable grce la programmationoriente objet, simplifie et clarifie la conception d'un logiciel (et dans notre cas d'une application web). Il est plusfacile de dire de quoi est constitue une vinaigrette lorsque les ingrdients sont tous poss sur la table, plutot qued'essayer d'analyser leur mlange au fond du saladier. Il n'y a pas proprement parler de nombre de classes dfini,

    MVC est un design pattern architectural, c'est un ensemble de principes suivre l'intrieur duquel un grand

    nombre d'autres motifs de conception interviennent.On peut ainsi crer "plein de" motifs MVCs, chacun rpondra un problme particulier. Cependant la plupart du

    temps, les developpeurs utiliseront des modles MVC dja crits, dans des frameworks ayant fait leurs preuves.

    http://julien-pauli.developpez.com/tutoriels/php/mvc-controleur/http://dico.developpez.com/html/2456-Conception-framework.phphttp://dico.developpez.com/html/1574-Conception-design-pattern.phphttp://dico.developpez.com/html/2456-Conception-framework.phphttp://dico.developpez.com/html/2353-Conception-motif-de-conception.phphttp://dico.developpez.com/html/1574-Conception-design-pattern.phphttp://www.martinfowler.com/eaaCatalog/modelViewController.htmlhttp://julien-pauli.developpez.com/tutoriels/php/mvc-controleur/http://blog.developpez.com/index.php?blog=126http://julien-pauli.developpez.com/http://developpez.net/forums/member.php?u=99082http://www.developpez.com/
  • 8/2/2019 Mvc Controleur

    6/19

    Le modle MVC et le contrleur sous PHP parJulien Pauli (Tutoriels, article et confrences PHP et developpement web) (Blog)

    - 6 -Copyright 2007 - 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/php/mvc-controleur/

    II - Principe du modle MVC

    Le but de MVC est de sparer les couches d'une application (en 3 couches distinctes, au minimum, et le plus souvent).On va donc distinguer :

    1 Le modle qui encapsule la logique mtier et la manipulation des sources de donnes. Ici, des designspatterns peuvent intervenir : TableDataGateway, ActiveRecord ....

    2 La vue : prsente les donnes au client les demandant (un utilisateur humain ou un autre programme). Ici

    aussi on peut introduire des motifs : Factory , Composite, TemplateView; par exemple3 Le contrleur : c'est tout le reste, c'est lui qui analyse la requte du client, accde aux donnes, formate le

    tout et l'envoie la partie vue qui va prsenter tout a.

    On va dtailler un peu, la vue d'abord, c'est un TemplateView. On utilise PHP lui-mme pour crire nos variablesdans du HTML, ou alors un moteur de template.Le TransformView peut aussi tre utilis pour sortir en transformant les donnes renvoyes par les modles, qui sont

    en XML, grce XSLT et les feuilles de style XSL. Une sortie en PDF peut aussi tre utilise ou encoreune prsentation JSON des donnes, dont les clients javascript et Ajax sont trs friands.

    Il est trs important de noter que la vue ne fait que prsenter des donnes et aucun moment elle ne connait leurprovenance. C'est le modle qui va fournir toutes les mthodes ncessaires la rcupration, et le contrleur qui sechargera de cette rcupration et de sa transformation ventuelle afin de coller la vue.

    Du cot du modle, il est trs important que celui-ci ne connaisse ni les contrleurs, ni les vues. Les liens vont descontrleurs vers le modle, de temps en temps, des vues vers le modle (on va voir a), mais jamais dans le sensinverse.Le modle tant totalement indpendant du reste, il pourra faire l'objet d'une rflexion et d'un dveloppement part.Il pourra de mme tre utilis par d'autres composants, tels que des webservices ou d'autres applications locales.Les donnes manipules par le modle doivent persister entre toutes les requtes HTTP, ainsi un support de stockagedevra tre utilis. Dans la majeure partie des cas, la source de donnes est une base de donnes relationnelle et le

    mapping objet relationnel ( ORM) pourra tre utilis, ou l'ActiveRecord, ce qui ne fait pas l'objet de cet article.

    Il est possible que la vue accde au modle. C'est un choix architectural qui devra tre bien rflchi, car il impose unplus fort couplage et un mlange des couches. On appelle a l'approche pull. C'est souvent rserv aux oprationslgres, comme par exemple afficher une liste de catgories d'lments quelconques ; et aux oprations de lectureuniquement.L'approche inverse, appele push, interdit la vue d'accder au modle. En gnral, on utilise les 2 choix en mmetemps : une instruction de lecture simple (rcuprer la liste des membres) sera demande directement par la vue,ou un de ses sous-composants.En revanche une opration de modification du modle, sera demande par un contrleur.

    Modle MVC global :

    http://julien-pauli.developpez.com/tutoriels/php/mvc-controleur/http://dico.developpez.com/html/3091-Conception-ORM-Object-Relational-Mapping.phphttp://dico.developpez.com/html/3091-Conception-ORM-Object-Relational-Mapping.phphttp://dico.developpez.com/html/1479-Internet-XSL-eXtensible-Stylesheet-Language.phphttp://dico.developpez.com/html/1481-Internet-XSLT-eXtended-Stylesheet-Language-Transformations.phphttp://dico.developpez.com/html/37-Internet-XML-eXtended-Markup-Langage.phphttp://dico.developpez.com/html/2283-Conception-composition.phphttp://dico.developpez.com/html/2419-Conception-vue.phphttp://julien-pauli.developpez.com/tutoriels/php/mvc-controleur/http://blog.developpez.com/index.php?blog=126http://julien-pauli.developpez.com/http://developpez.net/forums/member.php?u=99082http://www.developpez.com/
  • 8/2/2019 Mvc Controleur

    7/19

    Le modle MVC et le contrleur sous PHP parJulien Pauli (Tutoriels, article et confrences PHP et developpement web) (Blog)

    - 7 -Copyright 2007 - 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/php/mvc-controleur/

    MVC gnral

    Diagramme de squence d'un MVC simple :

    MVC details

    http://julien-pauli.developpez.com/tutoriels/php/mvc-controleur/http://julien-pauli.developpez.com/tutoriels/php/mvc-controleur/http://blog.developpez.com/index.php?blog=126http://julien-pauli.developpez.com/http://developpez.net/forums/member.php?u=99082http://www.developpez.com/
  • 8/2/2019 Mvc Controleur

    8/19

    Le modle MVC et le contrleur sous PHP parJulien Pauli (Tutoriels, article et confrences PHP et developpement web) (Blog)

    - 8 -Copyright 2007 - 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/php/mvc-controleur/

    Et on arrive enfin au contrleur, c'est un peu l'objet de cet article, car c'est lui le composant principal du modleMVC. Il agit avec le modle, la vue et d'autres contrleurs tout la fois.Quel qu'il soit, le contrleur reoit et analyse la requte du client, accde au modle, et prsente la vue.

    http://julien-pauli.developpez.com/tutoriels/php/mvc-controleur/http://julien-pauli.developpez.com/tutoriels/php/mvc-controleur/http://julien-pauli.developpez.com/tutoriels/php/mvc-controleur/http://blog.developpez.com/index.php?blog=126http://julien-pauli.developpez.com/http://developpez.net/forums/member.php?u=99082http://www.developpez.com/
  • 8/2/2019 Mvc Controleur

    9/19

    Le modle MVC et le contrleur sous PHP parJulien Pauli (Tutoriels, article et confrences PHP et developpement web) (Blog)

    - 9 -Copyright 2007 - 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/php/mvc-controleur/

    III - Le frontController ou contrleur frontal

    Il existe plusieurs motifs associs au contrleur. Le PageController impose un contrleur par page. C'est le schma'logique' qui nous vient l'esprit, l'exemple montr plus haut implmente cette ide.De manire simple nous avons spar les 3 couches, et chaque action raliser va se trouver dans un fichier distinct,

    par exemple post_comment.php , read_new.php ; etc...

    Le contrleur doit donc :1 Analyser la requte, soit extraire les informations dans l'URL2 Faire une mise jour du modle si ncessaire, en lui passant des paramtres3 Dterminer la vue afficher et demander son affichage

    Chaque contrleur regroupe l'ensemble des responsabilits dans un seul fichier appel dans l'URL, c'est le motif leplus clair et le plus facile mettre en uvre, la POO n'tant pas ncessaire.Cependant dans des applications qui gagnent un peu en complexit, de la factorisation s'impose et de nouveauxrles vont alors apparaitre:

    Le FrontController, ou contrleur frontal, est un motif qui est destin prendre en charge l'analyse de la requteclient. Il est donc le seul et unique point d'entre de l'application et va orchestrer toute la suite. C'est un singleton,gnralement invoqu dans index.php, et on lui fournit les actions demandes dans l'URL :http://monsite.com/index.php?action=show_livres&categorie=x ou pour faire plus joli avec de la rcriture d'URL :http://monsite.com/livres/show/categorie/xLe site tant en gnral plus complexe que a, l'url intgrera aussi ce qu'on appelle un module :http://monsite.com/bibliotheque/livres/show/categorie/x. Notez que le mapping entre l'URL et le systme MVC sous-jascent peut lui aussi devenir une rsponsabilit et tre reprsenter sous forme "d'objets de routage".

    FrontController est associe au design pattern Command qui va utiliser des objets "$request" et "$response" pourreprsenter l'entre et la sortie du systme. Cette caractristique est commune tout systme MVC bas sur le motifFrontController. La classe Request est en charge de l'analyse de l'URL fournie et elle va dterminer un module, une

    action, des paramtres.Le FrontController appelle alors le fichier correspondant l'action (motif Command), et va invoquer sa mthodelaunch(). L'action va tre excute.A la fin, l'action demande le rendu d'une vue via render(), puis son affichage via printOut(), mais elle peut aussidemander une redirection grce redirect(), ou passer la main une autre action avec forward().

    classe Request

  • 8/2/2019 Mvc Controleur

    10/19

    Le modle MVC et le contrleur sous PHP parJulien Pauli (Tutoriels, article et confrences PHP et developpement web) (Blog)

    - 10 -Copyright 2007 - 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/php/mvc-controleur/

    classe Request if (empty($requestUri)) returnarray();

    $path=parse_url($requestUri, PHP_URL_PATH); preg_match('#^(/(?P\w+))(/(?P\w+)/?)?$#',$path,$matches);

    $args=explode('&',parse_url($requestUri, PHP_URL_QUERY));

    $matches['args']=$args; return$matches; }

    }

    classe Response

  • 8/2/2019 Mvc Controleur

    11/19

    Le modle MVC et le contrleur sous PHP parJulien Pauli (Tutoriels, article et confrences PHP et developpement web) (Blog)

    - 11 -Copyright 2007 - 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/php/mvc-controleur/

    classe frontController privatefunction__construct() {

    $this->_request=new Request(); $this->_response=new Response(); }

    publicstaticfunction getInstance() {

    if (is_null(self::$_instance)){ self::$_instance=newself(); }

    returnself::$_instance; }

    publicfunction dispatch($defaults=null) {

    $parsed=$this->_request->route(); $parsed=array_merge($this->_defaults,$parsed); $this->forward($parsed['module'],$parsed['action']); }

    publicfunction forward($module,$action) { $command=$this->_getCommand($module,$action); $command->launch($this->_request,$this->_response); }

    privatefunction _getCommand($module,$action) {

    if(!file_exists($path="$module/$action.php")){ thrownewException("Commande inconnue $module/$action.php"); }

    require($path); $class=$action.'Action';

    returnnew$class($this); }

    publicfunction getResponse() {

    return$this->_response; }

    publicfunction redirect($url) {

    $this->_response->redirect($url); }

    publicfunction render($file) {

    $view=new View(); $this->_response->setBody($view->render($file,$this->_response->getVars())); }

    }

    classe View

    class View{

    publicfunction render($file,$assigns=array()) {

    extract($assigns); ob_start(); require($file); $str=ob_get_contents(); ob_end_clean(); return$str;

    }}

    http://julien-pauli.developpez.com/tutoriels/php/mvc-controleur/http://julien-pauli.developpez.com/tutoriels/php/mvc-controleur/http://blog.developpez.com/index.php?blog=126http://julien-pauli.developpez.com/http://developpez.net/forums/member.php?u=99082http://www.developpez.com/
  • 8/2/2019 Mvc Controleur

    12/19

    Le modle MVC et le contrleur sous PHP parJulien Pauli (Tutoriels, article et confrences PHP et developpement web) (Blog)

    - 12 -Copyright 2007 - 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/php/mvc-controleur/

    classe Action

    abstractclass Action{

    protected$_controller;

    publicfunction__construct($controller)

    { $this->_controller=$controller; }

    abstractpublicfunction launch(Request $request, Response $response);

    publicfunction render($file) {

    $this->_controller->render($file); }

    publicfunction printOut() {

    $this->_controller->getResponse()->printOut(); }

    protectedfunction _forward($module,$action) {

    $this->_controller->forward($module,$action); }

    protectedfunction _redirect($url) {

    $this->_controller->redirect($url); }}

    index (main)

    $front= frontController::getInstance()->dispatch();

    Le code est dj plus complexe, on est pass de l'objet. On le pilotera de cette manire :

    une commande quelconque

    C'est rapide, mais c'est destin vous faire intgrer ce concept de sparation des rles, c'est a qui est importantdans MVC.Il ne sert rien d'avoir une structure telle que celle-ci, car en fait apache peut aiguiller lui-mme les requtes grceau mod_rewrite et tout le code peut tre crit de manire procdurale.En fait, le code objet crit plus haut montre globalement le principe utilis dans la plupart des frameworks, ceux-

    ci s'efforcent en plus de rajouter un vrai plus la structure : Zend_Controller_Router_Rewrite, par exemple, est uncomposant de routage intgr au Zend Framework, qui va bien plus loin que le mod _rewrite d'Apache, en permettantd'crire la vole certaines URLs de manire totalement personnalise, en n'importe quel point du site.

    http://julien-pauli.developpez.com/tutoriels/php/mvc-controleur/http://julien-pauli.developpez.com/tutoriels/php/mvc-controleur/http://julien-pauli.developpez.com/tutoriels/php/mvc-controleur/http://julien-pauli.developpez.com/tutoriels/php/mvc-controleur/http://julien-pauli.developpez.com/tutoriels/php/mvc-controleur/http://blog.developpez.com/index.php?blog=126http://julien-pauli.developpez.com/http://developpez.net/forums/member.php?u=99082http://www.developpez.com/
  • 8/2/2019 Mvc Controleur

    13/19

    Le modle MVC et le contrleur sous PHP parJulien Pauli (Tutoriels, article et confrences PHP et developpement web) (Blog)

    - 13 -Copyright 2007 - 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/php/mvc-controleur/

    Ce n'est pas le seul ajout qui y est fait. Le frontController fonctionne de mche aussi avec le motif InterceptingFilter, quifait partie du design plus global ChainOfAction. Ce motif permet de centraliser toutes les actions qui sont communes chaque requte : vrification d'identit de la personne, affichage du header du site... Le contrleur frontal recevanttoutes les requtes, il est facile d'y intgrer des traitements qui se rptent pour toutes les requtes.

    Exemple interceptingFilter

  • 8/2/2019 Mvc Controleur

    14/19

    Le modle MVC et le contrleur sous PHP parJulien Pauli (Tutoriels, article et confrences PHP et developpement web) (Blog)

    - 14 -Copyright 2007 - 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/php/mvc-controleur/

    IV - Motif actionController

    Nous venons de voir le fonctionnement d'un frontController, associ au motif command : Le frontController dclenchela mthode launch() du fichier action trouv.

    Il est possible de factoriser encore un peu plus le traitement, en implmentant les ActionController. Ils ont pourbut de regrouper toutes les actions faisant rfrence une mme entit logique sur le site. Une partie de la logiquedu frontController est alors intgre dans les actionController, qui il passe l'objet de requte et l'objet de rponse.Un tage de plus s'est cre, ce qui permet d'y voir rellement plus clair dans notre code et le cheminement de nosactions, on peut aussi intgrer la gestion des codes http avec la gestion des exceptions, etc ...Ici, nous arrivons un niveau de difficult de conception qui impose l'orientation objet du code, afin d'en tirer toutesa puissance. Mais mesure que la conception se complique, l'utilisation du modle objet, elle, devient tout de suitesimple et claire.

    Diagramme de squence du MVC ActionController

    classe frontController

    abstractclass FrontController{

    publicstaticfunction dispatch() {

    try{ $request =new Request(); $response=new Response();

    ActionController::process($request,$response)->printOut(); }catch (Exception$e){

    ActionController::processException($request,$response,$e)->printOut();

    }

    }}

    classe ActionController

    class ActionController

    http://julien-pauli.developpez.com/tutoriels/php/mvc-controleur/http://julien-pauli.developpez.com/tutoriels/php/mvc-controleur/http://blog.developpez.com/index.php?blog=126http://julien-pauli.developpez.com/http://developpez.net/forums/member.php?u=99082http://www.developpez.com/
  • 8/2/2019 Mvc Controleur

    15/19

    Le modle MVC et le contrleur sous PHP parJulien Pauli (Tutoriels, article et confrences PHP et developpement web) (Blog)

    - 15 -Copyright 2007 - 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/php/mvc-controleur/

    classe ActionController{

    protected$_request; protected$_response; protected$_redirected;

    publicstaticfunctionprocess(Request $request, Response $response)

    { if (!file_exists($path='controllers/'.$request->getParam('controller') .'.php')){ thrownew ControleurIntrouvableException ('contrleur introuvable'); }

    require_once($path); $class=$request->getParam('controller') .'Controller'; $controller=new$class($request,$response); return$controller->launch(); }

    publicstaticfunction processException(Request $request, Response $response,Exception$e) {

    $controller=newself($request,$response); return$controller->launchException($e); }

    publicfunction__construct(Request $request, Response $response) {

    $this->_request =$request; $this->_response=$response; $this->_redirected=false; }

    privatefunction _actionExists($action) {

    try{ $method=new ReflectionMethod(get_class($this),$action); return ($method->isPublic() &&!$method->isConstructor()); }catch (Exception$e){ returnfalse; }

    }

    publicfunction redirect($url) {

    if ($this->_redirected==true){ thrownewException('Une redirection a dja t demande'); }

    $this->_response->redirect($url); $this->_redirected=true; }

    privatefunction _render($file) {

    $view=new View(); $this->_response->setBody($view->render(dirname(__FILE__) .'/views/'.$file,$this-

    >_response->getVars())); }

    publicfunction__get($param) {

    return$this->_response->getVar($param); }

    publicfunction__set($name,$param) {

    $this->_response->addVar($name,$param); }

    publicfunction launch() {

    $action=$this->_request->getParam('action'); if (!$this->_actionExists($action)){ thrownew ActionIntrouvableException('Action introuvable');

    http://julien-pauli.developpez.com/tutoriels/php/mvc-controleur/http://julien-pauli.developpez.com/tutoriels/php/mvc-controleur/http://blog.developpez.com/index.php?blog=126http://julien-pauli.developpez.com/http://developpez.net/forums/member.php?u=99082http://www.developpez.com/
  • 8/2/2019 Mvc Controleur

    16/19

    Le modle MVC et le contrleur sous PHP parJulien Pauli (Tutoriels, article et confrences PHP et developpement web) (Blog)

    - 16 -Copyright 2007 - 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/php/mvc-controleur/

    classe ActionController }

    // prefiltering

    $this->$action();

    // postfiltering

    if (!$this->_redirected){ $this->_render($this->_request->getParam('action') .'.php'); }

    return$this->_response; }

    publicfunction launchException(Exception$e) {

    if ($einstanceof MVCException){ $this->_render('404.php'); }else{ $this->_render('500.php'); }

    return$this->_response; }

    }

    classes d'Exception

    class ActionIntrouvableException extends MVCException {}class ControleurIntrouvableException extends MVCException {}class MVCException extends Exception {}

    index (main)

    $front= frontController::dispatch();

    Ca se complique encore, on voit premire vue que le rle du frontController est rduit un simple bloc try - catch.Une grosse partie de la logique de controle a t dporte dans l'ActionController, dont tous les contrleurs applicatifshriteront.La partie vue est simplifie ici. Grace aux mthodes magiques __get et __set, le contrleur peut assigner directementune valeur la vue via $this->unePropriete. C'est un systme que l'on retrouve souvent.

    Souvent aussi, la gestion des vues est un peu plus complexe, avec des Factory et Composite, on peut alors

    arriver un diagramme de squence qui ressemble a :

    http://julien-pauli.developpez.com/tutoriels/php/mvc-controleur/http://julien-pauli.developpez.com/tutoriels/php/mvc-controleur/http://julien-pauli.developpez.com/tutoriels/php/mvc-controleur/http://julien-pauli.developpez.com/tutoriels/php/mvc-controleur/http://julien-pauli.developpez.com/tutoriels/php/mvc-controleur/http://dico.developpez.com/html/991-Conception-diagramme-de-sequence.phphttp://dico.developpez.com/html/2283-Conception-composition.phphttp://julien-pauli.developpez.com/tutoriels/php/mvc-controleur/http://blog.developpez.com/index.php?blog=126http://julien-pauli.developpez.com/http://developpez.net/forums/member.php?u=99082http://www.developpez.com/
  • 8/2/2019 Mvc Controleur

    17/19

    Le modle MVC et le contrleur sous PHP parJulien Pauli (Tutoriels, article et confrences PHP et developpement web) (Blog)

    - 17 -Copyright 2007 - 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/php/mvc-controleur/

    MVC actionController + ViewFactory

    A titre informatif, on peut regarder le diagramme de flux du modle MVC du Zend Framework :

    http://julien-pauli.developpez.com/tutoriels/php/mvc-controleur/http://julien-pauli.developpez.com/tutoriels/php/mvc-controleur/http://blog.developpez.com/index.php?blog=126http://julien-pauli.developpez.com/http://developpez.net/forums/member.php?u=99082http://www.developpez.com/
  • 8/2/2019 Mvc Controleur

    18/19

    Le modle MVC et le contrleur sous PHP parJulien Pauli (Tutoriels, article et confrences PHP et developpement web) (Blog)

    - 18 -Copyright 2007 - 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/php/mvc-controleur/

    Zend Framework MVC

    http://julien-pauli.developpez.com/tutoriels/php/mvc-controleur/http://julien-pauli.developpez.com/tutoriels/php/mvc-controleur/http://blog.developpez.com/index.php?blog=126http://julien-pauli.developpez.com/http://developpez.net/forums/member.php?u=99082http://www.developpez.com/
  • 8/2/2019 Mvc Controleur

    19/19

    Le modle MVC et le contrleur sous PHP parJulien Pauli (Tutoriels, article et confrences PHP et developpement web) (Blog)

    - 19 -

    V - Conclusions

    Nous venons de voir un petit bout du motif MVC, notamment la partie contrleur en liaison avec beaucoup de DesignPatterns connus. Pour un site rapide, petit, ou n'tant pas amen voluer rapidement, un tel motif peut s'avrerlourd en gestion. D'autant plus qu'Apache + PHP permettent dj pas mal de libert.

    Sur une application plus complexe, en revanche, dvelopper au sein d'un Framework tel que Zend Framework ouSymfony permettra de produire du code plus clair, de sparer chaque rle de votre application, de programmer plusieurs (les rgles tant communes) et de faire voluer trs simplement le code, pour peu que celui-ci ait t pensconvenablement ses dbuts.Ceci permet aussi de garder en tte le cheminement des requtes, de travailler avec des diagrammes, de simplifierindirectement la gestion de projet.Alors que PHP tait l'origine conu comme un langage "glue", le modle objet de PHP5 alli la puissance internede PHP montre bien que celui-ci est autant capable que Java, .NET, Ruby ou autre, en terme de conception etd'architecture logicielle.

    Il faut aussi savoir manger toutes les gamelles, je vous conseille de vous pencher sur Java EE, et ses frameworks

    MVC, comme Struts par exemple, ou Rails pour Ruby, vous y apprendrez beaucoup de choses.Programmation web/PHP et architecture MVC

    Implmentation du pattern MVC (Java)Prsentation de tout un tas de Design Pattern (exemples en Java)

    La rubrique ruby pourrait vous tre utile aussi

    Notre rubrique conception

    Notre espace Zend Framework

    http://zend-framework.developpez.com/http://conception.developpez.com/http://ruby.developpez.com/http://smeric.developpez.com/java/uml/http://baptiste-wicht.developpez.com/tutoriel/conception/mvc/http://tahe.developpez.com/web/php/mvc/http://dico.developpez.com/html/3109-Langages-Struts.phphttp://dico.developpez.com/html/155-Langages-J2EE-Java-2-Entreprise-Edition.phphttp://blog.developpez.com/index.php?blog=126http://julien-pauli.developpez.com/http://developpez.net/forums/member.php?u=99082http://www.developpez.com/