====== Zend Framework ====== {{:informatique:php:zend-framework_logo.gif|Zend Framework}} http://framework.zend.com/ Programmer's Reference Guide : [[http://framework.zend.com/manual/fr|fr]] [[http://framework.zend.com/manual/en|en]] [[/informatique/php/comparaison_zend_framework_symfony|Comparaison Zend_Framework et Symfony]] [[/informatique/php/zend_framework/etude_perso|Etude perso]] ===== Sources de documentation ===== sur developpez.net/.com : [[http://zend-framework.developpez.com/|Accueil]] [[http://zend-framework.developpez.com/cours/|Cours]], [[http://zend-framework.developpez.com/faq/|FAQ]], [[http://www.developpez.net/forums/f447/php/outils/zend/zend-framework/|Forums]] * * [[http://julien-pauli.developpez.com/|Les cours de Julien Pauli]] sur developpez.com sont très pertinents (sécurité, ZendFramework, ...). * le Zend Framework Francophone: http://www.z-f.fr * http://mikaelkael.fr/ pour la traduction fr du guide de référence. * [[http://robertbasic.com/blog/online-resources-for-zend-framework/|Online resources for Zend Framework]] by Robert Basic * Les méthodes et classes Fast_X de http://sekaijin.ovh.org/ (Fast_Action, Fast_Controller_Action, Fast_Config, ...) ==== QuickStart ==== * (en) http://framework.zend.com/docs/quickstart * (fr) http://julien-pauli.developpez.com/tutoriels/zend-framework/presentation/ MVC: * (fr) http://framework.zend.com/manual/fr/zend.controller.html#zend.controller.quickstart * (fr] http://www.reseaucerta.org/cotecours/ccMVC/index.html * (fr) [[http://www.kitpages.fr/zf_helper_plugin.php|Plugins et helpers du MVC du Zend Framework]] sur kitpages.fr * [[http://blog.keppens.biz/2009/06/create-modular-application-with-zend.html|Create a modular application with Zend Framework]] by Jeroen Keppens on 2009-06-16 ==== Articles ==== * [[http://www.whitewashing.de/blog/articles/117|Using a Dependency Injection Container with Zend_Application]] , Benjamin Eberlei, 2009-06-16 * PHP Performance Tips from Stas Malyshev: On his blog, Stas Malyshev (Core Contributor to PHP and Zend Employee) has posted a [[http://php100.wordpress.com/2009/07/13/php-performance/|list of PHP Performance tips that he wants novices to know about]]. He realized that while he had [[http://php100.wordpress.com/2009/06/26/php-performance-google/|previously panned a post by Google about PHP Performance]] of having lots of incorrect or misleading information, but that he never gave good substitute advice himself. * [[http://steven.macintyre.name/tag/zend-framework/|Building a Zend Modular CMS System]] (JQuery, BB Code, Navigation and Blocks, TinyMCE, ...) ===== Plugins ===== ==== Web Debug Bar ==== === ZFDebug === [[http://jokke.dk/software/scientadebugbar|ZFDebug]], previously known as Scienta ZF Debug Bar. \\ {{:informatique:php:zend_framework:scienta_debugbar.png|}} The available plugins at this point (v1.5 - 2009-05-21) are: * Cache: Information on Zend_Cache and APC. * Database: Full listing of SQL queries and the time for each. * Exception: Error handling of errors and exceptions. * File: Number and size of files included with complete list. * Html: Number of external stylesheets and javascripts. Link to validate with W3C. * Memory: Peak memory usage, memory usage of action controller and support for custom memory measurements. * Registry: Contents of Zend_Registry * Time: Timing information of current request, time spent in action controller and custom timers. Also average, min and max time for requests. * Variables: View variables, request info and contents of $_COOKIE and $_POST [[http://code.google.com/p/zfdebug/|Project site]] on code.google.com. ===== Ze Framework ===== La convention "Package/SousPackage/Fichier.php" qui donnera "class Package_SousPackage_Fichier". ==== Front Controller ==== Le processus de contrôleur frontal est un design pattern très connu qui s'intègre dans un modèle MVC. Le but du FC est de prendre en charge la totalité du traitement de la requête cliente. Pour ceci, le FC joue le rôle de chef d'orchestre, c'est d'ailleurs un singleton, à juste titre. Il va faire intervenir beaucoup d'objets, et va les faire jouer ensemble. On notera un objet de requête, un objet de réponse, un ensemble d'objet routeurs, un dispatcheur, un ensemble de contrôleurs dits "d'action", des aides aux actions (Action Helpers), puis des plugins et un objet conteneur de plugins. Notez que FC ne touche pas à l'objet de vue. Controller Workflow Summary: * Zend_Controller_Front - manages the overall workflow. * Zend_Controller_Request*- accessors for controllers and actions (and status .. e.g. already dispatched) * Zend_Controller_Router - exactly once per request, calculates correct controllers and actions based on environment in Zend_Controller_Request * Zend_Controller_Dispatcher - transfers flow of execution to controllers and actions in request object (Zend_Controller_Request*). Process repeats until no more actions are scheduled. * Zend_Controller_Action* - userland controller classes containing userland actions * Zend_Controller_Response* - contains the output of the executed actions Le processus complet du MVC de Zend Framework peut être résumé à ce plan là : 1. -FC initialise les plugins, le router, et le dispatcher 2. -FC execute routeStartup() pour tous les plugins qui lui sont envoyés 3. -FC execute le routeur pour récupérer un objet $request correspondant à un module, controller, action 4. -FC execute routeShutdown() pour tous les plugins qui lui sont envoyés 5. -FC execute dispatchLoopStartup() pour tous les plugins qui lui sont envoyés 6. -FC entre dans la boucle de dispatching 7. ---FC marque {{$request}} comme dispatchée ( isDispatched() = TRUE ) 8. ---FC execute preDispatch() pour tous les plugins qui lui sont envoyés 9. ---FC demande au dispatcher de dispatcher la requête $request 10. ------dispatcher instancie le contrôleur d'action 11. ------dispatcher marque la requête $request comme dispatchée 12. ------dispatcher execute dispatch() sur le contrôleur d'action 13. ---------le contrôleur d'action execute son init() 14. ---------le contrôleur d'action execute notifyPreDispatch() pour tous les helpers qui lui sont passés 15. ---------le contrôleur d'action execute son preDispatch() 16. ---------le contrôleur d'action execute la requête $action (PRINCIPAL) 17. -----------A ce stade on peut demander à FC d'abandonner immédiatement tout le processus si une exception est envoyée 18. ---------le contrôleur d'action execute son postDispatch() 19. ---------le contrôleur d'action execute notifyPostDispatch() pour tous les helpers qui lui sont passés 20. ------FC execute postDispatch() pour tous les plugins qui lui sont envoyés 21. ------la boucle de dispatching recommence si la requête n'est pas marquée comme dispatchée (redirection) 22. -FC sort de la boucle de dispatching, le traitement de l'action est terminé 23. -FC execute dispatchLoopShutdown() pour tous les plugins qui lui sont envoyés 24. -FC retourne $response ou l'affiche directement Voir: * [[http://julien-pauli.developpez.com/tutoriels/zend-framework/atelier/infiniteloops-plugin/|Plugin FrontController anti boucles infinies de dispatching]] (Eviter les boucles infinies de dispatching dans un modèle MVC à contrôleur frontal) ==== Zend_Layout ==== Zend_Layout utilise le [[/informatique/design_pattern#two-step_view|design pattern Two-Step View]], ce qui permet d'encapsuler le contenu d'une vue dans une autre, généralement appelée template. D'autres projets les appellent aussi layouts, ainsi Zend Framework utilise ce terme. Les principales caractéristiques de Zend_Layout sont : * Automatiser le rendu des layouts lorsqu'ils sont utilisés avec les composants MVC du Zend Framework. * Fournir un cadre à part entière pour les variables du layout, au même titre que les variables de vue. * Permettre la configuration du nom des layouts, la recherche des scripts leurs correspondant (inflexion), ainsi que leurs chemins d'accès. * Permettre de désactiver les layouts temporairement, changer leur configuration ; tout ceci depuis les contrôleurs ou les scripts de vue. * Utiliser les mêmes règles de résolution (inflexion) que le ViewRenderer, mais sans empêcher de les personnaliser à part. * Une intégration sous forme d'aides/plugin dans le modèle MVC de Zend Framework. Zend_Layout permet d'être utilisé de manière plus pointu. Vous pouvez agir sur ces éléments : * Objet de vue personnalisé. Zend_Layout accepte tout objet de vue implémentant l'interface Zend_View_Interface. * Plugin contrôleur frontal personnalisé. Zend_Layout est livré avec un plugin qui rend le layout automatiquement avant de renvoyer la réponse (utilisation MVC). Vous pouvez injecter votre propre plugin. * Aide d'action personnalisée. Zend_Layout est livrée avec une aide d'action qui devrait en théorie suffire dans la majorité des cas. C'est un proxy vers l'objet Zend_Layout. Vous pouvez cependant utiliser votre propre classe d'aide. * Résolveur de chemin de script personnalisé. Zend_Layout vous permet d'utiliser votre in-flecteur pour la résolution des scripts de layout ou de modifier l'inflecteur par défaut. Zend_Layout n'est pas un composant de MVC. Son arborescence est telle qu'il n'est pas intégré dans le modèle MVC, il peut donc être utilisé en dehors. Parallèlement, le modèle MVC peut être utilisé sans Zend_Layout. {{:informatique:php:zf_zend-layout_sequence_01.jpg|Zend_Layout Diagramme de séquence simplifié}} Voir: * [[http://julien-pauli.developpez.com/tutoriels/zend-framework/atelier/zend-layout/|Introduction au templating avec Zend_Layout]] ==== Zend_Db==== [[http://julien-pauli.developpez.com/tutoriels/zend-framework/presentation//images/Zend_Db.gif|Zend_Db class diagram]] Voir: * [[http://julien-pauli.developpez.com/tutoriels/zend-framework/presentation/|Présentation du Zend Framework - Premiers pas]] * [[http://julien-pauli.developpez.com/tutoriels/zend-framework/atelier/listage-tables/|Création d'un processus de listage du contenu d'une table]] * [[http://baptiste-wicht.developpez.com/tutoriel/php/zend-framework/full-loading/|Implémenter le Full Loading sur Zend Framework]] ==== Plugins ==== Le modèle MVC de ZF regorge de designs patterns et parmi eux, on note de nombreux proxies, qui je le rappelle permettent de déléguer le traitement entier d'un processus à une autre classe. Le contrôleur frontal de Zend Framework utilise le motif proxy via des plugins. Un plugin est une classe que l'on peut injecter dans le frontController, et qui va avoir un but précis et agir au sein même du processus de dispatching. Les plugins sont principalement destinés à gérer les problèmes de routage. Les helpers sont utilisés pour tous les traitements que vous seriez tentés de recopier dans toutes vos actions. Un bon article sur le sujet: [[http://www.kitpages.fr/zf_helper_plugin.php|Plugins et helpers du MVC du Zend Framework]] sur kitpages.fr Voir: * [[http://julien-pauli.developpez.com/tutoriels/zend-framework/atelier/mvc-plugins-actionhelpers/|MVC, les plugins et les aides d'action]] * [[http://www.kitpages.fr/zf_helper_plugin.php|Plugins et helpers du MVC du Zend Framework]] sur kitpages.fr ====Helpers==== Helpers: aides d'action. Les plugins sont principalement destinés à gérer les problèmes de routage. Les helpers sont utilisés pour tous les traitements que vous seriez tentés de recopier dans toutes vos actions. Un bon article sur le sujet: [[http://www.kitpages.fr/zf_helper_plugin.php|Plugins et helpers du MVC du Zend Framework]] sur kitpages.fr Voir: * [[http://julien-pauli.developpez.com/tutoriels/zend-framework/atelier/mvc-plugins-actionhelpers/|MVC, les plugins et les aides d'action]] * [[http://www.kitpages.fr/zf_helper_plugin.php|Plugins et helpers du MVC du Zend Framework]] sur kitpages.fr ==== Zend_Config ==== Permet de lire un fichier de configuration au format .INI. Gère l'héritage de section ([section child : section root]) et de clé (parentkey.childkey) Zend_Config est un [[/informatique/design_pattern#composite|design pattern Composite]]. [[http://julien-pauli.developpez.com/tutoriels/zend-framework/presentation//images/Zend_Config.gif|Zend_Config class diagram]] ==== Zend_View ==== [[http://julien-pauli.developpez.com/tutoriels/zend-framework/presentation//images/Zend_View.gif|Zend_View class diagram]] * [[http://zend-framework.developpez.com/sekaijin/blog/zf/template/|Utiliser le moteur de template de son choix]] === PhpTAL === Discussion sur l'usage de PhpTAL comme Zend_View : * http://blog.realmofzod.com/2008/04/14/how-to-make-them-work-together/ et http://framework.zend.com/wiki/display/ZFPROP/Zend_View_PhpTal+-+Matthew+Ratzloff * http://www.z-f.fr/forum/viewtopic.php?id=1097 * http://taat.pl/article/zend_framework_tutorial/step2/ ==== Zend_Form ==== Doc Zend_Form [[http://framework.zend.com/manual/fr/zend.form.html|fr]] [[http://framework.zend.com/manual/en/zend.form.html|en]]. * [[http://devzone.zend.com/article/3450|Decorators with Zend_Form]] * [[http://wiip.fr/content/zend-form-personnaliser-les-messages-des-validateurs|personnaliser les messages des validateurs]] === Exemples === == Exemple 01 == Le code php : $formAction = $_SERVER['REQUEST_URI'] ; $form = new Zend_Form(); // afin qu'il renvoie vers la même page que celle l'ayant crée, ceci simplifie les traitements. $form->setAction($formAction) ->setAttrib('id', 'dvp-form') ->setDescription('formulaire exemple developpez.com') ->setEnctype(Zend_Form::ENCTYPE_URLENCODED) ->setLegend('légende') ->setMethod('POST') ->setName('dvp-form') ->setView( $this->view ) ; $text = new Zend_Form_Element_Text('un champ texte'); $text->setRequired(true) ->setErrorMessages(array('required'=>'Element requis')) ->setLabel('Voici un champ texte :') ->setDescription('Ce champ est là à titre informatif pour le tutoriel') ->setAttrib('size','70'); $envoyer = $form->createElement('submit','envoyer'); $form->addElements(array($text,$envoyer)); le code html obtenu après post du formulaire sans avoir renseigné le champs 'unchamptexte' (required not satisfied) :
  • Element requis

Ce champ est là à titre informatif pour le tutoriel

 
==== Bootstrap ==== [[http://monzee.wordpress.com/2009/06/08/modular-applications-in-zf-1-8/|Writing module bootstraps]] {{:informatique:php:zend_framework:bootstrap_sequence.png|}} ==== Performance ==== Lire "Annexe C. Zend Framework Performance Guide" du guide de référence du programmeur. Les domaines d'optimisation traités sont: "Chargement des classes", "Zend_Db Performance", "Internationalisation", "View rendering". [[http://php100.wordpress.com/2008/05/16/benchmarking-zend-framework-loader/|Benchmarking Zend Framework loader]] Posted by Stas 2008-05-16 | **Without bytecode cache:** ||| | | require_once | Zend_Loader | | php5.2 | 4.42 | 4.42 | | php5.3 | 4.96 | 4.97 | | **With bytecode cache:** ||| | | require_once | Zend_Loader | | php5.2 | 63.04 | 56.62 | | php5.3 | 61.28 | 55.52 | //The numbers are requests per second, so more is better. Test run on Linux dual 2GHz AMD// Voir [[/informatique/php/performance|/informatique/php/performance]] ===== Aller plus loin ===== ==== Bootstrap and other startup ==== [[http://le-blog.zframework-fr.org/le-framework-zend/mise-en-place-dun-bootstrap-ameliore-avec-initializer/#more-42|Mise en place d’un bootstrap amélioré avec Initializer]] ==== Testing ==== [[http://www.alexatnet.com/node/12|Automatic testing of MVC applications created with Zend Framework]] by Alex Netkachov on 2007-03-20 Voir [[/informatique/tests]] ==== Zend_Form ==== [[http://julien-pauli.developpez.com/tutoriels/zend-framework/atelier/formlogin/|Créer un formulaire de login réutilisable basé sur Zend_Form]] par Julien Pauli (09/02/2009) > Zend_Form est un composant touffu, mais très puissant. Plus encore que d'autres composants du Zend Framework , Zend_Form a été prévu pour être étendu. Nous allons voir comment créer un LoginForm, basé sur Zend_Form, qui comme son nom l'indique, permet la connexion d'une personne grâce à un couple login/password avec une vérification de l'identité via une base de données. === Using Zend_Form in Your Models === * [[http://www.whitewashing.de/blog/articles/109|Zend_Form and the Model: Yet another perspective using a Mediator]] 23/01/2009 * [[http://codeutopia.net/blog/2009/01/07/another-idea-for-using-models-with-forms/|Another idea for using models with forms]] 07/01/2009 * [[http://weierophinney.net/matthew/archives/200-Using-Zend_Form-in-Your-Models.html|Using Zend_Form in Your Models]] 22/12/2008 === Database backed Zend_Form elements === http://codeutopia.net/blog/2009/03/09/database-backed-zend_form-elements/ A relatively common task when working with forms is filling select boxes or checkbox and radiobutton lists from a database. It’s not very tricky to query a database, and fill a Zend_Form element’s possible values from the resultset, but it can be quite boring and extraneous code… We could also create an element which we can give some SQL, and it’ll fill itself automatically! This way you can even define database-backed elements in XML or INI configuration files. The main benefits of this approach show when you want to create forms quickly, for example when you’re still developing your application. With this, you can easily define where the data in the element comes from without having to write code to query the database manually. This is also where the main drawback lies: because each element of this kind will perform an SQL query, you may suddenly find a lot of queries, depending on the setup. As an added bonus, this also works with Zend_Config based forms! If you like building your forms in XML or INI files, you can use this element and define all this in the configuration. Just leave out the dbAdapter value, and remember to set a default adapter in Zend_Db_Table in your bootstrap or such - this is why we test it in the element’s code. Implementing this for checkboxes or radios would follow a quite similar process - you’d just mainly change the class which is being extended. === Zend_Form decorators === http://codeutopia.net/blog/2008/08/07/zend_form-decorator-tips/ It seems a lot of people are struggling with Zend_Form decorators. They want to know how to modify the markup, but they can’t figure out how to do it with the bundled decorators or how to write their own. Since I’ve done some decorator-stuff myself, I thought I’d share some tips on making the output a bit nicer. For example, how to make Zend_Form use