Symfony {9782212124941}

  • Upload
    yaaaf

  • View
    263

  • Download
    1

Embed Size (px)

Citation preview

  • 7/27/2019 Symfony {9782212124941}

    1/509

    les Cahiersdu

    Programmeur

    Mieux dvelopper en PHP

    avec Symfony 1.2 et Doctrine

    Hugo Hamon

    Fabien Potencier

    ger a-E uc.com

  • 7/27/2019 Symfony {9782212124941}

    2/509

    Programmez intelligentavec les Cahiers

    duProgrammeur

    Conceptioncouverture:Nordcompo

    Fabien Potencier est ing-nieur civil des Mines de Nancy etdiplm du mastre Entrepre-neurs HEC. Il a cr le frame-work Symfony dont il est le dve-loppeur principal. Co-fondateurde Sensio, il dirige Sensio Labs,agence spcialise dans les tech-nologies Open Source.

    Diplm dune licence spcialise

    en dveloppement informatique,Hugo Hamon a rejoint SensioLabs en tant que dveloppeurweb. Passionn par PHP, il afond le siteet promeut le langage en milieuprofessionnel en sinvestissantdans lAFUP et dans la commu-naut Symfony.

    SommaireUne tude de cas Symfony : Jobeet Bonnes pratiques Environnements dexcution Configurer le serveur web Le serveur virtuel Intgrer Subversion Spcifications fonc-tionnelles tude des besoins Concevoir le modle Configurer MySQL LORM Doctrine Schma de la base Architecture MVC Le contrleur : les actions La vue : les tem-plates Images et feuilles de style Helpers Erreur 404 Interaction client/serveur Le framework de routage Configuration des URL Routage muler HTTP PUT etDELETE Dbogage Optimiser le modle Dboguer les requtes SQL RefactoringMVC en continu Partiels Slots Composants Tests unitaires Le framework Lime

    Intgrit du modle Maintenabilit du code Tests fonctionnels Simuler le naviga-teur Tester lapplication Gestion des formulaires Valider les donnes Intgrationdans les templates et actions Scurit Attaques CSRF et XSS Maintenance auto-matise Interface dadministration Gnration automatique Configuration des vues Ergonomie Ajout de fonctionnalits Authentification et droits daccs Sessions Politique de droits Scuriser le backend Flux de syndication Atom et services web

    XML, JSON et YAML Envoi de-mails Moteur de recherche PHP Lucene Dynamiserlinterface avec Ajax JavaScript jQuery Requtes Ajax Internationalisation et locali-sation Support des langues, jeux de caractres et encodages Traduction dynamique

    Plug-ins Symfony Gestion du cache Rduire les temps de chargement Dploiementen production Connexion SSH et rsync Le format YAML Fichiers de configurationsettings.yml et factories.yml.

    SymfonyReconnu dans le monde pour sa puissance et son lgance, Symfony est issu deplus de dix ans de savoir-faire. Le framework open source de Sensio fdre unetrs forte communaut de dveloppeurs PHP professionnels. Il leur offre desoutils et un environnement MVC pour crer des applications web robustes, main-

    tenables et volutives.

    Au fil dune dmarche rigoureuse et dun exemple concret dapplication web 2.0,ce cahier dcrit le bon usage des outils Symfony mis la disposition du dvelop-peur : de larchitecture MVC et autres design patterns labstraction de base dedonnes et au mapping objet-relationnel avec Doctrine, en passant par les testsunitaires et fonctionnels, la gestion des URL, des formulaires ou du cache,linternationalisation ou encore la gnration des interfaces dadministration

    @ Adapt du tutoriel Jobeet mis jour en franais Tlchargez le code source !http://www.symfony-project.org/jobeet/

  • 7/27/2019 Symfony {9782212124941}

    3/509

    les Cahiersdu

    Programmeur

    Symfony

  • 7/27/2019 Symfony {9782212124941}

    4/509

    ColleCtion lesCahiersduprogrammeur

    G. pononet J. Pauli. Zend Framework. N12392, 2008, 460 pages.

    l. Jayr. Flex 3.Applications Internet riches. N12409, 2009, 226 pages.

    p. roques. UML 2. Modliser une application web. N12389, 6e dition, 2008, 247 pages

    a. gonCalves. Java EE 5. N12363, 2e dition, 2008, 370 pages

    e. puybaret. Swing. N12019, 2007, 500 pages

    e. puybaret. Java 1.4 et 5.0. N11916, 3e dition, 2006, 400 pages

    J. molire. J2EE. N11574, 2e dition, 2005, 220 pages

    R. Fleury Java/XML. N11316, 2004, 218 pages

    J. protzenko, B. PiCaud. XUL. N11675, 2005, 320 pages

    S. mariel. PHP 5. N11234, 2004, 290 pages

    Chezlemmediteur

    C. porteneuve. Bien dvelopper pour le Web 2.0. N12391, 2e dition 2008, 600 pages.

    e. daspet, C. pierrede geyer. PHP 5 avanc. N12369, 5e dition, 2008, 844 pages

    G. ponon. Best practices PHP 5. Les meilleures pratiques de dveloppement en PHP. N11676, 2005, 470 pages

    t. ziad. Programmation Python. N12483, 2e dition, 2009, 530 pages

    C. pierrede geyer, g. ponon. Mmento PHP 5 et SQL. N12457, 2e dition, 2009, 14 pages

    J.-m. deFranCe. Premires applications Web 2.0 avec Ajax et PHP. N12090, 2008, 450 pages

    d. seguy, p. gamaChe. Scurit PHP 5 et MySQL. N12114, 2007, 250 pages

    a. vannieuwenhuyze. Programmation Flex 3. N12387, 2008, 430 pages

    V. messager-rota. Gestion de projet. Vers les mthodes agiles. N12158, 2e dition, 2009, 252 pages

    H. bersini, i. wellesz. Lorient objet. N12084, 3e dition, 2007, 600 pages

    p. roques. UML 2 par la pratique. N12322, 6e dition, 368 pages

    s. bordage. Conduite de projet Web. N12325, 5e dition, 2008, 394 pages

    J. Dubois, J.-P. Retaill, T. Templier. Spring par la pratique.Java/J2EE, Spring, Hibernate, Struts, Ajax. n11710, 2006, 518 pages

    a. bouCher. Mmento Ergonomie web. N12386, 2008, 14 pages

    a. Fernandez-toro. Management de la scurit de linformation. Implmentation ISO 27001. N12218, 2007, 256 pages

    ColleCtion aCCslibre Pour que linformatique soit un outil, pas un ennemi !

    conomie du logiciel libre. F. elie. N12463, 2009, 195 pages

    Hackez votre Eee PC. Lultraportable efficace. C. guelFF. N12437, 2009, 306 pages

    Joomla et Virtuemart Russir sa boutique en ligne. V. isaksen, T. tardiF. N12381, 2008, 270 pages

    Open ERP Pour une gestion dentreprise efficace et intgre. F. pinCkaers, g. gardiner. N12261, 2008, 276 pages

    Russir son site web avec XHTML et CSS. m. nebra. N12307, 2e dition, 2008, 316 pages

    Ergonomie web. Pour des sites web efficaces. a. bouCher. N12479, 2e dition, 2009, 456 pages

    Gimp 2 efficace Dessin et retouche photo. C. gmy. N12152, 2e dition, 2008, 402 pages

    OpenOffice.org 3 efficace. s. gautier, g. bignebat, C. hardy, m. pinquier. N12408, 2009, 408 pages avec CD-Rom.

    Russir un site web dassociation avec des outils libres. a.-l. et d. quatravaux. N12000, 2e dition, 2007, 372 pages

    Russir un projet de site Web. n. Chu. N12400, 5e dition, 2008, 230 pages

  • 7/27/2019 Symfony {9782212124941}

    5/509

    les Cahiersdu Programmeur

    Symfony

    Fabien Potencier

    Hugo Hamon

    Mieux dvelopper en PHPavec Symfony 1.2 et Doctrine

  • 7/27/2019 Symfony {9782212124941}

    6/509

    DITIONS EYROLLES61, bd Saint-Germain75240 Paris Cedex 05

    www.editions-eyrolles.com

    Le code de la proprit intellectuelle du 1erjuillet 1992 interdit en effet expressment la photocopie usage collectif sansautorisation des ayants droit. Or, cette pratique sest gnralise notamment dans les tablissements denseignement,provoquant une baisse brutale des achats de livres, au point que la possibilit mme pour les auteurs de crer des uvresnouvelles et de les faire diter correctement est aujourdhui menace.En application de la loi du 11 mars 1957, il est interdit de reproduire intgralement ou partiellement le prsent ouvrage,sur quelque support que ce soit, sans autorisation de lditeur ou du Centre Franais dExploitation du Droit de Copie, 20,

    rue des Grands-Augustins, 75006 Paris. Groupe Eyrolles, 2009, ISBN : 978-2-212-12494-1

    Remerciements Franck Bodiot pour certaines illustrations douverture de chapitre.

  • 7/27/2019 Symfony {9782212124941}

    7/509

    Groupe Eyrolles, 2008

    Aprs plus de trois ans dexistence en tant que projet Open Source,Symfony est devenu lun des frameworks incontournables de la scnePHP. Son adoption massive ne sexplique pas seulement par la richesse

    de ses fonctionnalits ; elle est aussi due lexcellence de sa documenta-tion probablement lune des meilleures pour un projet Open Source.

    La sortie de la premire version officielle de Symfony a t clbre avecla publication en ligne du tutoriel Askeet, qui dcrit la ralisation duneapplication sous Symfony en 24 tapes prvues pour durer chacune uneheure. Publi Nol 2005, ce tutoriel devint un formidable outil de pro-motion du framework. Nombre de dveloppeurs ont en effet appris utiliser Symfony grce Askeet, et certaines socits lutilisent encorecomme support de formation.Le temps passant, et avec larrive de la version 1.2 de Symfony, il futdcid de publier un nouveau tutoriel sur le mme format quAskeet. LetutorielJobeetfut ainsi publi jour aprs jour sur le blog officiel de Sym-fony, du 1er au 24 dcembre 2008 ; vous lisez actuellement sa versiondite sous forme de livre papier.

    Dcouvrir ltude de cas dveloppeCet ouvrage dcrit le dveloppement dun site web avec Symfony, depuisses spcifications jusqu son dploiement en production, en 21 chapitresdune heure environ. Au travers des besoins fonctionnels du site dve-lopper, chaque chapitre sera loccasion de prsenter non seulement lesfonctionnalits de Symfony mais galement les bonnes pratiques du

    dveloppement web.

    Avant-propos

    COMMUNAUTUne tude de cas communautaire

    Pour Askeet, il avait t demand la commu-naut des utilisateurs de Symfony de proposer unefonctionnalit ajouter au site. Linitiative eut dusuccs et le choix se porta sur lajout dun moteurde recherche. Le vu de la communaut fut ra-lis, et le chapitre consacr au moteur derecherche est dailleurs rapidement devenu lundes plus populaires du tutoriel.Dans le cas de Jobeet, lhiver a t clbr le21 dcembre avec lorganisation dun concours dedesign o chacun pouvait soumettre une charte gra-phique pour le site. Aprs un vote communautaire,la charte de lagence amricaine centre{source}fut choisie. Cest cette interface graphique qui seraintgre tout au long de ce livre.

  • 7/27/2019 Symfony {9782212124941}

    8/509

    SymfonyM

    ieuxdvelopperenPHPavecSym

    fony1.2etDoctrine

    Groupe Eyrolles, 2008VI

    Lapplication dveloppe dans cet ouvrage aurait pu tre un moteur deblog exemple souvent choisi pour dautres frameworks ou langages de

    programmation. Nous souhaitions cependant un projet plus riche et plusoriginal, afin de dmontrer quil est possible de dvelopper facilement etrapidement des applications web professionnelles avec Symfony. Cestau chapitre 2 que vous en dcouvrirez les spcificits ; pour le moment,seul son nom de code est mmoriser :Jobeet...

    En quoi cet ouvrage est-il diffrent ?On se souvient tous des dbuts du langage PHP 4. Ctait la belle poquedu Web ! PHP a certainement t lun des premiers langages de program-mation ddi au Web et srement lun des plus simples matriser.

    Mais les technologies web voluant trs vite, les dveloppeurs ont besoindtre en permanence lafft des dernires innovations et surtout desbonnes pratiques. La meilleure faon deffectuer une veille technolo-gique efficace est de lire des blogs dexperts, des tutoriels prouvs etbien videmment des ouvrages de qualit. Cependant, pour des langagesaussi varis que le PHP, le Python, le Java, le Ruby, ou mme le Perl, ilest dcevant de constater quun grand nombre de ces ouvrages prsen-tent une lacune majeure... En effet, ds quil sagit de montrer des exem-ples de code, ils laissent de ct des sujets primordiaux, et pallient lemanque par des avertissements de ce genre : Lors du dveloppement dun site, pensez aussi la validation et la

    dtection des erreurs ; Le lecteur veillera bien videmment ajouter la gestion de la

    scurit ; Lcriture des tests est laisse titre dexercice au lecteur.

    Or chacune de ces questions validation, scurit, gestion des erreurs,tests est primordiale ds quil sagit dcrire du code professionnel.Comment ne pas se sentir, en tant que lecteur, un peu abandonn ? Sices contraintes de surcrot les plus complexes grer pour un dve-

    loppeur ne sont pas prises en compte, les exemples perdent de leurintrt et de leur exemplarit !

    Le livre que vous tenez entre les mains ne contient pas davertissementde ce type : une attention particulire est prte lcriture du codencessaire pour grer les erreurs et pour valider les donnes entres parlutilisateur. Du temps est galement consacr lcriture de tests auto-matiss afin de valider les dveloppements et les comportementsattendus du systme.

    BONNEPRATIQUE Rutilisez le code libre quandil est exemplaire !

    Le code que vous dcouvrirez dans ce livre peutservir de base vos futurs dveloppements ;nhsitez surtout pas en copier-coller des boutspour vos propres besoins, voire en rcuprer desfonctionnalits compltes si vous le souhaitez.

    http://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdf
  • 7/27/2019 Symfony {9782212124941}

    9/509

    Avant-propos

    Groupe Eyrolles, 2008 VII

    Symfony fournit en standard des outils permettant au dveloppeur de tenircompte de ces contraintes plus facilement et en tant parcimonieux en quan-

    tit de code. Une partie de cet ouvrage est consacre ces fonctionnalits carencore une fois, la validation des donnes, la gestion des erreurs, la scuritet les tests automatiss sont ancrs au cur mme du framework ce qui luipermet dtre employ y compris sur des projets de grande envergure.

    Dans la philosophie de Symfony, les bonnes pratiques de dveloppementont donc part gale avec les nombreuses fonctionnalits du framework.Elles sont dautant plus importantes que Symfony est utilis pour ledveloppement dapplications critiques en entreprise.

    Organisation de louvrageCet ouvrage est compos de vingt-et-un chapitres qui expliquent pas pas la construction dune application web professionnelle Open Sourceavec le framework Symfony. Lobjectif de cette srie de chapitres est dedtailler une une les fonctionnalits qui font le succs de Symfony,

    mais aussi et surtout de montrer ce qui fait de Symfony un outil profes-sionnel, efficace et agrable utiliser.

    Le chapitre 1 ouvre le bal avec linstallation et linitialisation du projetJobeet. Ces premires pages sont jalonnes en cinq parties majeures : letlchargement et linstallation des librairies de Symfony, la gnrationde la structure de base du projet ainsi que celle de la premire applica-tion, la configuration du serveur web et enfin linstallation dun dptSubversion pour le contrle du suivi du code source.

    Le chapitre 2 dresse le cahier des charges fonctionnelles de lapplicationdveloppe au fil des chapitres. Les besoins fonctionnels majeurs deJobeet y seront dcrits un un laide de cas dutilisation illustrs.

    Le chapitre 3 entame vritablement les hostilits en sintressant laconception du modle de la base de donnes, et la construction auto-matique de cette dernire partir de lORM Doctrine. Lintgralit duchapitre sera ponctue par de nombreuses astuces techniques et bonnes

    pratiques de dveloppement web. Ce chapitre sachvera enfin avec lagnration du tout premier module fonctionnel de lapplication laidedes tches automatiques de Symfony.

    Le chapitre 4 aborde lun des points cls du framework Symfony :limplmentation du motif de conception Modle Vue Contrleur. Cesquelques pages expliqueront tous les avantages quapporte cette mtho-dologie prouve en termes dorganisation du code par rapport uneautre, et sera loccasion de dcouvrir et de mettre en uvre les couches

    de la Vue et du Contrleur.

  • 7/27/2019 Symfony {9782212124941}

    10/509

    SymfonyMieuxdvelopperenPHPavecSym

    fony1.2etDoctrine

    Groupe Eyrolles, 2008VIII

    Le chapitre 5 se consacre quant lui un autre sujet majeur deSymfony : le routage. Cet aspect du framework concerne la gnration

    des URLs propres et la manire dont elles sont traites en interne parSymfony. Ce chapitre sera donc loccasion de prsenter les diffrentestypes de routes quil est possible de crer et de dcouvrir comment cer-taines dentre elles sont capables dinteragir directement avec la base dedonnes pour retrouver des objets qui leur sont lis.

    Le chapitre 6 est ddi la manipulation de la couche du Modle avecSymfony. Ce sera donc loccasion de dcouvrir en dtail comment le fra-mework Symfony et lORM Doctrine permettent au dveloppeur de

    manipuler une base de donnes en toute simplicit laide dobjets pluttque de requtes SQL brutes. Ce chapitre met galement laccent sur uneautre bonne pratique ancre dans la philosophie du framework Symfony :le remaniement du code. Le but de cette partie du chapitre est de sensibi-liser le lecteur lintrt dune constante remise en question de ses dve-loppements lorsquil a la possibilit de lamliorer et de le simplifier.

    Le chapitre 7 est une compilation de tous les sujets abords prcdem-ment puisquil y est question du modle MVC, du routage et de la mani-

    pulation de la base de donnes par lintermdiaire des objets. Toutefois,les pages de ce chapitre introduisent deux nouveaux concepts : la simpli-fication du code de la Vue ainsi que la pagination des listes de rsultatsissus dune base de donnes. De la mme manire quau sixime cha-pitre, un remaniement rgulier du code sera opr afin de comprendretous les bnfices de cette bonne pratique de dveloppement.

    Le chapitre 8 prsente son tour un sujet encore mconnu des dve-loppeurs professionnels mais particulirement important pour garantir laqualit des dveloppements : les tests unitaires. Ces quelques pages pr-sentent tous les avantages de lajout de tests automatiques pour uneapplication web, et expliquent de quelle manire ces derniers sont parfai-tement intgrs au sein du framework Symfony via la librairie OpenSource Lime.

    Le chapitre 9 fait immdiatement suite au prcdent en se consacrant un autre type de tests automatiss : les tests fonctionnels. Lobjectif de ce

    chapitre est de prsenter ce que sont vritablement les tests fonctionnelset ce quils apportent comme garanties au cours du dveloppement delapplication Jobeet. Symfony est en effet dot dun sous-framework detests fonctionnels puissant et simple prendre en main, qui permet audveloppeur dexcuter la simulation de lexprience utilisateur dans sonnavigateur, puis danalyser toutes les couches de lapplication qui sontimpliques lors de ces scnarios.

    http://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdf
  • 7/27/2019 Symfony {9782212124941}

    11/509

    Avant-propos

    Groupe Eyrolles, 2008 IX

    Pour ne pas interrompre le lecteur dans sa lance et sa soif dapprentissage,le chapitre 10 aborde limportante notion de gestion des formulaires. Les

    formulaires constituent la principale partie dynamique dune applicationweb puisquelle permet lutilisateur final dinteragir avec le systme. Bienque les formulaires soient faciles mettre en place, leur gestion nendemeure pas moins trs complexe puisquelle implique des notions de vali-dation de la saisie des utilisateurs, et donc de scurit. Heureusement,Symfony intgre un sous-framework destin aux formulaires capable desimplifier et dautomatiser leur gestion en toute scurit.

    Le chapitre 11 agrge les connaissances acquises aux chapitres 9 et 10 en

    expliquant de quelle manire il est possible de tester fonctionnellementdes formulaires avec Symfony. Par la mme occasion, ce sera le momentidal pour crire une premire tche automatique de maintenance, ex-cutable en ligne de commande ou dans une tche planifie du serveur.

    Le chapitre 12 est lun des plus importants de cet ouvrage puisquil faitle tour complet dune des fonctionnalits les plus apprcies des dve-loppeurs Symfony : le gnrateur dinterface dadministration. En quel-ques minutes seulement, cet outil permettra de btir un espace complet

    et scuris de gestion des catgories et des offres demploi de Jobeet.Lutilisateur est lacteur principal dans une application puisque cest luiqui interagit avec le serveur et qui rcupre ce que ce dernier lui renvoieen retour. Par consquent, le chapitre 13 se ddie entirement lui etmontre, entre autres, comment sauvegarder des informations persis-tantes dans la session de lutilisateur, ou encore comment lui restreindrelaccs certaines pages sil nest pas authentifi ou sil ne dispose pas desdroits daccs ncessaires et suffisants. Dautre part, une srie de rema-niements du code sera ralise pour simplifier davantage le code et lerendre testable.

    Le chapitre 14 sintresse une puissante fonctionnalit du sous-fra-mework de routage : le support des formats de sortie et larchitectureRESTful. cette occasion, un module complet de gnration de flux desyndication RSS/ATOM est dvelopp en guise dexemple afin de mon-trer avec quelle simplicit Symfony est capable de grer nativement dif-

    frents formats de sortie standards.Le chapitre 15 approfondit les connaissances sur le framework de rou-tage et les formats de sortie en dveloppant une API de services webdestins aux webmasters, qui leur permet dinterroger Jobeet afin denrcuprer des rsultats dans un format de sortie XML, JSON ou YAML.Lobjectif est avant tout de montrer avec quelle aisance Symfony facilitela cration de services web innovants grce son architecture RESTful.

  • 7/27/2019 Symfony {9782212124941}

    12/509

    SymfonyMieuxdvelopperenPHPavecSym

    fony1.2etDoctrine

    Groupe Eyrolles, 2008X

    Toute application dynamique qui se respecte comprend spontanmentun moteur de recherche, et cest exactement l objectif du chapitre 16. En

    seulement quelques minutes, lapplication Jobeet bnficiera dunmoteur de recherche fonctionnel et test, reposant sur le composantZend_Search_Lucene du framework Open Source de la socit Zend.Cest lun des nombreux avantages de Symfony que de pouvoir accueillirsimplement des composants tiers comme ceux du framework Zend.

    Le chapitre 17 amliore lexprience utilisateur du moteur de recherchecr au chapitre prcdent, en intgrant des composants JavaScript etAjax non intrusifs, dvelopps au moyen de lexcellente librairie jQuery.

    Grce ces codes JavaScript, lutilisateur final de Jobeet bnficiera dunmoteur de recherche dynamique qui filtre et rafrachit la liste de rsultatsen temps rel chaque fois quil saisira de nouveaux caractres dans lechamp de recherche.

    Le chapitre 18 aborde un nouveau point commun aux applications webprofessionnelles : linternationalisation et la localisation. Grce Symfony,lapplication Jobeet se dotera dune interface multilingue dont les contenustraduits seront grs la fois par Doctrine pour les informations dynami-

    ques des catgories, et par le biais de catalogues XLIFF standards.Le chapitre 19 se consacre la notion de plug-ins dans Symfony. Lesplug-ins sont des composants rutilisables travers les diffrents projets, etqui constituent galement un moyen dorganisation du code diffrent de lastructure par dfaut propose par Symfony. Par consquent, les pages de cechapitre expliquent pas pas tout le processus de transformation delapplication Jobeet en plug-in compltement indpendant et rutilisable.

    Le chapitre 20 de cet ouvrage se consacre au puissant sous-frameworkde mise en cache des pages HTML afin de rendre lapplication encoreplus performante lorsquelle sera dploye en production au dernier cha-pitre. Ce chapitre est aussi loccasion de dcouvrir de quelle manire denouveaux environnements dexcution peuvent tre ajouts au projet,puis soumis des tests automatiss.

    Enfin, le chapitre 21 clture cette tude de cas par la prparation delapplication la dernire tape dcisive dun projet web : le dploiement

    en production. Les pages de ce chapitre introduisent tous les concepts deconfiguration du serveur web de production ainsi que les outils dauto-matisation des dploiements tels que rsync.

    Pour conclure, trois parties dannexes sont disponibles la fin de cetouvrage pour en savoir plus sur la syntaxe du format YAML et sur lesdirectives de paramtrage de deux fichiers de configuration de Symfonyprsents dans chaque application dveloppe.

    http://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdf
  • 7/27/2019 Symfony {9782212124941}

    13/509

    Avant-propos

    Groupe Eyrolles, 2008 XI

    Remerciements

    crire un livre est une activit aussi excitante qupuisante. Pour unouvrage technique, cest dautant plus intense quon cherche, heure aprsheure, comprendre comment faire passer son message, comment expli-quer les diffrents concepts, et comment fournir des exemples la foissimples, pertinents et rutilisables.

    crire un livre est une tche tout simplement impossible raliser sanslaide de certaines personnes qui vous entourent et vous soutiennent toutau long de ce processus.

    Le plus grand soutien que lon peut obtenir vient bien sr de sa proprefamille, et je sais que jai lune des familles les plus comprhensives etencourageantes qui soient. En tant quentrepreneur, je passe dj la plu-part de mon temps au bureau, et en tant que principal dveloppeur deSymfony, je passe une grande partie de mon temps libre concevoir laprochaine version du framework. cela sajoute ma dcision dcrire unnouveau livre. Mais sans les encouragements constants de ma femmeHlne et de mes deux merveilleux fils, Thomas et Lucas, ce livre

    naurait jamais t crit en si peu de temps et naurait jamais pu voir lejour si rapidement.

    Cet ouvrage naurait pu tre ralis sans le soutien dautres personnesque je tiens particulirement remercier. En tant que prsident-direc-teur gnral de Sensio, jai de nombreuses responsabilits, et grce lappui de toute lquipe de Sensio, jai pu mener terme ce projet. Mesprincipaux remerciements vont tout droit Grgory Pascal, mon parte-naire depuis dix ans, qui tait au dbut particulirement sceptique quant lide dentreprendre avec le business model de lOpen Source ; ilmen remercie normment aujourdhui.

    Je souhaite aussi remercier Laurent Vaquette, mon aide de camp, qui nacess de me simplifier la vie chaque jour, et daccepter de maccompagnerde temps en temps pour manger un dner kebab.

    Je remercie galement Jonathan Wage, le dveloppeur principal duprojet Doctrine, qui a pris part lcriture de cet ouvrage. Grce ses

    nombreux efforts, la communaut Symfony bnficie aujourdhui delORM Doctrine en natif dans Symfony ainsi que dune vritable sourcede documentation par lintermdiaire de cet ouvrage.

    Enfin, Hugo Hamon, qui a t le principal artisan de cette transforma-tion de la version originale anglaise, et qui il me semble juste de laisserune place de co-auteur mes cts, sur ce premier ouvrage en franais.

    Fabien Potencier

  • 7/27/2019 Symfony {9782212124941}

    14/509

    SymfonyMieuxdvelopperenPHPavecSym

    fony1.2etDoctrine

    Groupe Eyrolles, 2008XII

    Je tiens avant tout remercier ma famille, mes amis et mes proches quimont soutenu et encourag de prs comme de loin dans cette aventure

    la fois passionnante, excitante et terriblement fatigante. Jen profitedailleurs pour ddicacer cet ouvrage mes deux frres Hadrien et Lo.

    Jadresse galement mes remerciements et ma reconnaissance toutelquipe de Sensio, et particulirement Grgory Pascal et Fabien Poten-cier qui ont su me faire confiance ds mon arrive dans leur entreprise, etme faire dcouvrir le plaisir de travailler sur des projets web passionnants.

    Hugo Hamon

    Nous noublions pas bien sr dadresser nos remerciements aux quipesdes ditions Eyrolles qui nous ont permis de mener ce livre son terme,et tout particulirement Muriel Shan Sei Fan pour avoir pilot ceprojet dans les meilleures conditions et dans la bonne humeur. Nousremercions galement Romain Pouclet qui na cess de produire un tra-vail remarquable de relecture technique et dindexation du contenu.

    Et enfin, nous vous remercions, vous lecteurs, davoir achet cet ouvrage.

    Nous esprons sincrement que vous apprcierez les lignes que vous vousapprtez lire, et bien sr que vous trouverez votre place parmilincroyable communaut des dveloppeurs Symfony.

    Fabien Potencier et Hugo Hamon

    http://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdf
  • 7/27/2019 Symfony {9782212124941}

    15/509

    Table des matires

    Groupe Eyrolles, 2007 XIII

    AVANT-PROPOS ............................................................VDcouvrir ltude de cas dveloppe VEn quoi cet ouvrage est-il diffrent ? VI

    Organisation de louvrage VIIRemerciements XI

    1. DMARRAGEDUPROJET ................................................ 1Installer et configurer les bases du projet 2

    Les prrequis techniques pour dmarrer 2Installer les librairies du framework Symfony 2Installation du projet 5

    Gnrer la structure de base du projet 5

    Gnrer la structure de base de la premire applicationfrontend 6Configuration du chemin vers les librairies de Symfony 7Dcouvrir les environnements muls par Symfony 7

    Quels sont les principaux environnements endveloppement web ? 8Spcificits de lenvironnement de dveloppement 8Spcificits de lenvironnement de production 9

    Configurer le serveur web 10Mthode 1 : configuration dangereuse ne pas reproduire 10Mthode 2 : configuration sre et recommande 11

    Cration dun nouveau serveur virtuel pour Jobeet 11Tester la nouvelle configuration dApache 12

    Contrler le code source avec Subversion 14Quels sont les avantages dun gestionnaire de versions ? 14Installer et configurer le dpt Subversion 14

    En rsum 16

    2. LTUDEDECAS ......................................................... 19 la dcouverte du projet 20Dcouvrir les spcifications fonctionnelles de Jobeet 22

    Les diffrents acteurs et applications impliqus 22Utilisation de lapplication grand public : le frontend 22

    Scnario F1 : voir les dernires offres en page daccueil 22Scnario F2 : voir les offres dune catgorie 23Scnario F3 : affiner la liste des offres avec des mots-cls 24

    Scnario F4 : obtenir le dtail dune offre 24

    Scnario F5 : poster une nouvelle annonce 25Scnario F6 : sinscrire en tant quaffili pour utiliser lAPI 27Scnario F7 : laffili rcupre la liste des dernires offres

    actives 27Utilisation de linterface dadministration : le backend 27Scnario B1 : grer les catgories 27Scnario B2 : grer les offres demploi 28Scnario B3 : grer les comptes administrateur 28Scnario B4 : configurer le site Internet 28

    En rsum 29

    3. CONCEVOIRLEMODLEDEDONNES.............................31

    Installer la base de donnes 32Crer la base de donnes MySQL 32Configurer la base de donnes pour le projet Symfony 32

    Prsentation de la couche dORM Doctrine 33Quest-ce quune couche dabstraction de base de donnes ? 34Quest-ce quun ORM ? 34Activer lORM Doctrine pour Symfony 35

    Concevoir le modle de donnes 36Dcouvrir le diagramme UML entit-relation 36Mise en place du schma de dfinition de la base 37

    De limportance du schma de dfinitionde la base de donnes 37crire le schma de dfinition de la base de donnes 37Dclaration des attributs des colonnes dune tableen format YAML 39

    Gnrer la base de donnes et les classes du modleavec Doctrine 40

    Construire la base de donnes automatiquement 40Dcouvrir les classes du modle de donnes 41Gnrer la base de donnes et le modle en une seule passe 42

    Prparer les donnes initiales de Jobeet 43Dcouvrir les diffrents types de donnesdun projet Symfony 43Dfinir des jeux de donnes initiales pour Jobeet 44Charger les jeux de donnes de tests en base de donnes 46Rgnrer la base de donnes et le modle en une seule passe 46

    Profiter de toute la puissance de Symfony dans le navigateur 47

  • 7/27/2019 Symfony {9782212124941}

    16/509

    Symfony

    MieuxdvelopperenPHPavecSym

    fony1.2etDoctrine

    Groupe Eyrolles, 2007XIV

    Gnrer le premier module fonctionnel job 47Composition de base dun module gnr par Symfony 47Dcouvrir les actions du module job 48

    Comprendre limportance de la mthode magique__toString() 49Ajouter et diter les offres demploi 50

    En rsum 50

    4. LECONTRLEURETLAVUE .......................................... 53Larchitecture MVC et son implmentation dans Symfony 54Habiller le contenu de chaque page avec un mme gabarit 55

    Dcorer une page avec un en-tte et un pied de page 55

    Dcorer le contenu dune page avec un dcorateur 56Intgrer la charte graphique de Jobeet 58

    Rcuprer les images et les feuilles de style 58Configurer la vue partir dun fichier de configuration 59Configurer la vue laide des helpers de Symfony 61

    Gnrer la page daccueil des offres demploi 62crire le contrleur de la page : laction index 62Crer la vue associe laction : le template 63Personnaliser les informations affiches pour chaque offre 64

    Gnrer la page de dtail dune offre 66Crer le template du dtail de loffre 66Mettre jour laction show 67

    Utiliser les emplacements pour modifier dynamiquement le titredes pages 68

    Dfinition dun emplacement pour le titre 68Fixer la valeur dun slot dans un template 68Fixer la valeur dun slot complexe dans un template 69

    Dclarer une valeur par dfaut pour le slot 69Rediriger vers une page derreur 404 si loffre nexiste pas 70Comprendre linteraction client/serveur 71

    Rcuprer le dtail de la requte envoye au serveur 71Rcuprer le dtail de la rponse envoye au client 72

    En rsum 73

    5. LEROUTAGE............................................................... 75 la dcouverte du framework de routage de Symfony 76

    Rappels sur la notion dURL 76Quest-ce quune URL ? 76Introduction gnrale au framework interne de routage 77

    Configuration du routage : le fichier routing.yml 77Dcouverte de la configuration par dfaut du routage 77Comprendre le fonctionnement des URL par dfautde Symfony 79

    Personnaliser les routes de lapplication 80Configurer la route de la page daccueil 80

    Configurer la route daccs au dtail dune offre 80Forcer la validation des paramtres des URLs internesde lapplication 82

    Limiter une requte certaines mthodes HTTP 82Optimiser la cration de routes grce la classe de routedobjets Doctrine 83

    Transformer la route dune offre en route Doctrine 83Amliorer le format des URL des offres demploi 84Retrouver lobjet grce sa route depuis une action 86

    Faire appel au routage depuis les actions et les templates 87Le routage dans les templates 87

    Le routage dans les actions 88Dcouvrir la classe de collection de routessfDoctrineRouteCollection 88

    Dclarer une nouvelle collection de routes Doctrine 88muler les mthodes PUT et DELETE 90

    Outils et bonnes pratiques lis au routage 91Faciliter le dbogage en listant les routes de lapplication 91Supprimer les routes par dfaut 93

    En rsum 93

    6. OPTIMISATIONDUMODLEETREFACTORING ..................95Prsentation de lobjet Doctrine_Query 96Dboguer le code SQL gnr par Doctrine 97

    Dcouvrir les fichiers de log 97Avoir recours la barre de dbogage 97

    Intervenir sur les proprits dun objet avant sa srialisationen base de donnes 98

    Redfinir la mthode save() dun objet Doctrine 98

    Rcuprer la liste des offres demploi actives 99Mettre jour les donnes de test pour sassurer de la validitdes offres affiches 99Grer les paramtres personnaliss dune applicationdans Symfony 100

    Dcouvrir le fichier de configuration app.yml 100Rcuprer une valeur de configuration depuis le modle 101

    Remanier le code en continu pour respecter la logique MVC 101Exemple de dplacement du contrleur vers le modle 102

    Avantages du remaniement de code 102Ordonner les offres suivant leur date dexpiration 103Classer les offres demploi selon leur catgorie 103

    Limiter le nombre de rsultats affichs 105Modifier les donnes de test dynamiquement par lajoutde code PHP 107Empcher la consultation dune offre expire 108Crer une page ddie la catgorie 110En rsum 110

    http://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://-/?-http://-/?-http://app/CahiersTitres.pdfhttp://-/?-
  • 7/27/2019 Symfony {9782212124941}

    17/509

    Tabledesmatires

    Groupe Eyrolles, 2007 XV

    7. CONCEVOIRETPAGINERLALISTEDOFFRESDUNECATGORIE ..................................................... 113Mise en place dune route ddie la page de la catgorie 114

    Dclarer la route category dans le fichier routing.yml 114Implmenter laccesseur getSlug() dans la classe JobeetJob 114

    Personnaliser les conditions daffichage du liende la page de catgorie 115

    Intgrer un lien pour chaque catgorie ayant plus de dix offresvalides 115Implmenter la mthode countActiveJobs() de la classeJobeetCategory 116

    Implmenter la mthode countActiveJobs() de la classeJobeetCategoryTable 116Mise en place du module ddi aux catgories 118

    Gnrer automatiquement le squelette du module 118Ajouter un champ supplmentaire pour accueillir le slugde la catgorie 119Cration de la vue de dtail de la catgorie 119

    Mise en place de laction executeShow() 119Intgration du template showSuccess.php associ 120

    Isoler le HTML redondant dans les templates partiels 121Dcouvrir le principe de templates partiels 121Cration dun template partiel _list.php pour les modulesjob et category 122Faire appel au partiel dans un template 122Utiliser le partiel _list.php dans les templatesindexSuccess.php et showSuccess.php 123

    Paginer une liste dobjets Doctrine 123Que sont les listes pagines et quoi servent-elles ? 123

    Prparer la pagination laide de sfDoctrinePager 124Initialiser la classe de modle et le nombre maximumdobjets par page 124Spcifier lobjet Doctrine_Query de slection des rsultats 125Configurer le numro de la page courante de rsultats 125Initialiser le composant de pagination 125

    Simplifier les mthodes de slection des rsultats 126Implmenter la mthode getActiveJobsQuery de lobjetJobeetCategory 126

    Remanier les mthodes existantes de JobeetCategory 126Intgrer les lments de pagination dans le templateshowSuccess.php 127

    Passer la collection dobjets Doctrine au template partiel 127Afficher les liens de navigation entre les pages 128Afficher le nombre total doffres publies et de pages 129Description des mthodes de lobjet sfDoctrinePagerutilises dans le template 129

    Code final du template showSuccess.php 130

    En rsum 131

    8. LESTESTSUNITAIRES .................................................133

    Prsentation des types de tests dans Symfony 134De la ncessit de passer par des tests unitaires 134Prsentation du framework de test lime 135

    Initialisation dun fichier de tests unitaires 135Dcouverte des outils de tests de lime 135

    Excuter une suite de tests unitaires 136Tester unitairement la mthode slugify() 137

    Dterminer les tests crire 137crire les premiers tests unitaires de la mthode 138

    Commenter explicitement les tests unitaires 138Implmenter de nouveaux tests unitaires au fil dudveloppement 140

    Ajouter des tests pour les nouvelles fonctionnalits 140Ajouter des tests suite la dcouverte dun bug 141Implmenter une meilleure mthode slugify 142

    Implmentation des tests unitaires dans le framework ORMDoctrine 144

    Configuration de la base de donnes 144Mise en place dun jeu de donnes de test 145Vrifier lintgrit du modle par des tests unitaires 145

    Initialiser les scripts de tests unitaires de modlesDoctrine 145Tester la mthode getCompanySlug() de lobjetJobeetJob 146Tester la mthode save() de lobjet JobeetJob 146

    Implmentation des tests unitaires dans dautres classes

    Doctrine 147Lancer lensemble des tests unitaires du projet 148En rsum 148

    9. LESTESTSFONCTIONNELS...........................................151Dcouvrir limplmentation des tests fonctionnels 152

    En quoi consistent les tests fonctionnels ? 152Implmentation des tests fonctionnels 153

    Manipuler les composants de tests fonctionnels 153

    Simuler le navigateur grce lobjet sfBrowser 153Tester la navigation en simulant le comportementdun vritable navigateur 153Modifier le comportement du simulateur de navigateur 154

    Prparer et excuter des tests fonctionnels 155Comprendre la structure des fichiers de tests 155Dcouvrir le testeur sfTesterRequest 157Dcouvrir le testeur sfTesterResponse 157Excuter les scnarios de tests fonctionnels 158

    Charger des jeux de donnes de tests 158

  • 7/27/2019 Symfony {9782212124941}

    18/509

    Symfony

    MieuxdvelopperenPHPavecSym

    fony1.2etDoctrine

    Groupe Eyrolles, 2007XVI

    crire des tests fonctionnels pour le module doffres 159Les offres demploi expires ne sont pas affiches 160Seulement N offres sont listes par catgorie 160

    Un lien vers la page dune catgorie est prsent lorsquil y atrop doffres 161Les offres demploi sont tries par date 162Chacune des offres de la page daccueil est cliquable 163

    Autres exemples de scnarios de tests pour les pages des modulesjob et category 164Dboguer les tests fonctionnels 167Excuter successivement des tests fonctionnels 167Excuter les tests unitaires et fonctionnels 168En rsum 168

    10. ACCLRERLAGESTIONDESFORMULAIRES ................ 171 la dcouverte des formulaires avec Symfony 172

    Les formulaires de base 172Les formulaires gnrs par les tches Doctrine 174Personnaliser le formulaire dajout ou de modificationdune offre 174Supprimer les champs inutiles du formulaire gnr 175Redfinir plus prcisment la configuration dun champ 175

    Utiliser le validateur sfValidatorEmail 176Remplacer le champ permettant le choix du type doffrepar une liste droulante 176Personnaliser le widget permettant lenvoi du logo associ une offre 178Modifier plusieurs labels en une seule passe 180Ajouter une aide contextuelle sur un champ 180

    Prsentation de la classe finale de configuration duformulaire dajout dune offre 180Manipuler les formulaires directement dans les templates 182

    Gnrer le rendu dun formulaire 182Personnaliser le rendu des formulaires 183

    Dcouvrir les mthodes de lobjet sfForm 183Comprendre et implmenter les mthodes de lobjetsfFormField 184

    Manipuler les formulaires dans les actions 184

    Dcouvrir les mthodes autognres du module job utilisantles formulaires 185Traiter les formulaires dans les actions 186

    Simplifier le traitement du formulaire dans le module job 186Comprendre le cycle de vie du formulaire 187Dfinir les valeurs par dfaut dun formulaire gnrpar Doctrine 187

    Protger le formulaire des offres par limplmentationdun jeton 188

    Gnrer le jeton automatiquement la cration 188Redfinir la route ddition de loffre grce au jeton 189

    Construire la page de prvisualisation 190

    Activer et publier une offre 192Prparer la route vers laction de publication 192Implmenter la mthode executePublish() 193Implmenter la mthode publish() de lobjet JobeetJob 193Empcher la publication et laccs aux offres non actives 194

    En rsum 195

    11. TESTERLESFORMULAIRES ........................................197Utiliser le framework de formulaires de manire autonome 198

    crire des tests fonctionnels pour les classes de formulaire 199Tester lenvoi du formulaire de cration doffre 199

    Renommer le nom des champs du formulaire 200Soumettre le formulaire laide de la mthode click() 200

    Dcouvrir le testeur sfTesterForm 201Tester si le formulaire est erron 201Les mthodes de lobjet sfTesterForm 201Dboguer un formulaire 202

    Tester les redirections HTTP 202Tester les objets gnrs par Doctrine 202

    Activer le testeur sfTesterDoctrine 203Tester lexistence dun objet Doctrine dans la basede donnes 203

    Tester les erreurs des champs du formulaire 203La mthode isError() pour le contrle des champs 204Tester la barre dadministration dune offre 205

    Forcer la mthode HTTP dun lien 206

    Forcer lutilisation de la mthode HTTP PUT 206Forcer lutilisation de la mthode HTTP DELETE 206crire des tests fonctionnels afin de dcouvrir des bogues 207

    Simuler lautopublication dune offre 207Contrler la redirection vers une page derreur 404 208Empcher laccs au formulaire ddition lorsque loffreest publie 209

    Tester la prolongation dune offre 210Comprendre le problme des offres expires ractiver 210

    Une route ddie pour prolonger la dure dune offre 210Implmenter la mthode executeExtend() aux actionsdu module job 211Implmenter la mthode extend() dans JobeetJob 212Tester la prolongation de la dure de vie dune offre 212

    Scuriser les formulaires 214Srialisation dun formulaire Doctrine 214Scurit native du framework de formulaire 214

    Se protger contre les attaques CSRF et XSS 216

    http://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdf
  • 7/27/2019 Symfony {9782212124941}

    19/509

    Tabledesmatires

    Groupe Eyrolles, 2007 XVII

    Les tches automatiques de maintenance 216Crer la nouvelle tche de maintenance jobeet:cleanup 217Implmenter la mthode cleanup() de la classe

    JobeetJobTable 218En rsum 219

    12. LEGNRATEURDINTERFACEDADMINISTRATION....... 221Cration de lapplication backend 222

    Gnrer le squelette de lapplication 222Recharger les jeux de donnes initiales 222Gnrer les modules dadministration 223Gnrer les modules category et job 223

    Personnaliser linterface utilisateuret lergonomie des modules du backoffice 224

    Dcouvrir les fonctions des modules dadministration 224Amliorer le layout du backoffice 225Comprendre le cache de Symfony 227Introduction au fichier de configuration generator.yml 228

    Configurer les modules autognrs par Symfony 229Organisation du fichier de configuration generator.yml 229Configurer les titres des pages des modules auto gnrs 229

    Changer le titre des pages du module category 229Configurer les titres des pages du module job 230

    Modifier le nom des champs dune offre demploi 231Redfinir globalement les proprits des champsdu module 231Surcharger localement les proprits des champsdu module 231Comprendre le principe de configuration en cascade 232

    Configurer la liste des objets 232Dfinir la liste des colonnes afficher 232Colonnes afficher dans la liste des catgories 232Liste des colonnes afficher dans la liste des offres 233

    Configurer le layout du tableau de la vue liste 233Dclarer des colonnes virtuelles 234Dfinir le tri par dfaut de la liste dobjets 235Rduire le nombre de rsultats par page 235Configurer les actions de lot dobjets 236

    Dsactiver les actions par lot dans le module category 236Ajouter de nouvelles actions par lot dans le module job 237Configurer les actions unitaires pour chaque objet 239

    Supprimer les actions dobjets des catgories 239Ajouter dautres actions pour chaque offre demploi 240

    Configurer les actions globales de la vue liste 240Optimiser les requtes SQL de rcuprationdes enregistrements 243

    Configurer les formulaires des vues de saisie de donnes 245

    Configurer la liste des champs afficher dans les formulairesdes offres 245Ajouter des champs virtuels au formulaire 247

    Redfinir la classe de configuration du formulaire 247Implmenter une nouvelle classe de formulaire par dfaut 247Implmenter un meilleur mcanisme de gestiondes photos des offres 249

    Configurer les filtres de recherche de la vue liste 251Supprimer les filtres du module de category 251Configurer la liste des filtres du module job 251

    Personnaliser les actions dun module autognr 252Personnaliser les templates dun module autognr 253La configuration finale du module 255

    Configuration finale du module job 255Configuration finale du module category 256

    En rsum 257

    13. AUTHENTIFICATIONETDROITSAVECLOBJETSFUSER ...259Dcouvrir les fonctionnalits de base de lobjet sfUser 260

    Comprendre les messages flash de feedback 261 quoi servent ces messages dans Symfony ? 261crire des messages flash depuis une action 261Lire des messages flash dans un template 262

    Stocker des informations dans la session courantede lutilisateur 262

    Lire et crire dans la session de lutilisateur courant 263Implmenter lhistorique de navigation de lutilisateur 263

    Refactoriser le code de lhistorique de navigationdans le modle 264

    Implmenter lhistorique de navigation dans la classemyUser 264Simplifier laction executeShow() de la couche contrleur 265Afficher lhistorique des offres demploi consultes 265Implmenter un moyen de rinitialiser lhistoriquedes offres consultes 267

    Comprendre les mcanismes de scurisation des applications 268Activer lauthentification de lutilisateur sur une application 268

    Dcouvrir le fichier de configuration security.yml 268

    Analyse des logs gnrs par Symfony 269Personnaliser la page de login par dfaut 269Authentifier et tester le statut de lutilisateur 270

    Restreindre les actions dune application lutilisateur 270Activer le contrle des droits daccs sur lapplication 271tablir des rgles de droits daccs complexes 271Grer les droits daccs via lobjet sfBasicSecurityUser 272

    Mise en place de la scurit de lapplication backend de Jobeet 273Installation du plug-in sfDoctrineGuardPlugin 273

  • 7/27/2019 Symfony {9782212124941}

    20/509

    Symfony

    MieuxdvelopperenPHPavecSym

    fony1.2etDoctrine

    Groupe Eyrolles, 2007XVIII

    Mise en place des scurits de lapplication backend 274Gnrer les classes de modle et les tables SQL 274Implmenter de nouvelles mthodes lobjet User via la

    classe sfGuardSecurityUser 274Activer le module sfGuardAuth et changer laction de loginpar dfaut 275Crer un utilisateur administrateur 276Cacher le menu de navigation lorsque lutilisateurnest pas authentifi 276Ajouter un nouveau module de gestion des utilisateurs 277

    Implmenter de nouveaux tests fonctionnels pour lapplicationfrontend 278En rsum 279

    14. LESFLUXDESYNDICATION ATOM ........................... 281Dcouvrir le support natif des formats de sortie 282

    Dfinir le format de sortie dune page 282Grer les formats de sortie au niveau du routage 283

    Prsentation gnrale du format ATOM 283Les informations globales du flux 284Les entres du flux 284Le flux ATOM minimal valide 284

    Gnrer des flux de syndication ATOM 285Flux ATOM des dernires offres demploi 285

    Dclarer un nouveau format de sortie 285Rappel des conventions de nommage des templates 286Ajouter le lien vers le flux des offres dans le layout 287Gnrer les informations globales du flux 288Gnrer les entres du flux ATOM 289

    Flux ATOM des dernires offres dune catgorie 290Mise jour de la route ddie de la catgorie 291Mise jour des liens des flux de la catgorie 291Factoriser le code de gnration des entres du flux 292Simplifier le template indexSuccess.atom.php 293Gnrer le template du flux des offres dune catgorie 293

    En rsum 295

    15. CONSTRUIREDESSERVICESWEB ............................... 297

    Concevoir le service web des offres demploi 298Prparer des jeux de donnes initiales des affilis 298Construire le service web des offres demploi 300

    Dclaration de la route ddie du service web 300Implmenter la mthode getForToken() de lobjetJobeetJobTable 301Implmenter la mthode getActiveJobs() de lobjetJobeetAffiliate 301

    Dvelopper le contrleur du service web 302

    Implmenter laction executeList() du module api 302

    Implmenter la mthode asArray() de JobeetJob 303Construction des templates XML, JSON et YAML 304

    Le format XML 304

    Le format JSON 305Le format YAML 306

    crire des tests fonctionnels pour valider le service web 309Formulaire de cration dun compte daffiliation 310

    Dclarer la route ddie du formulaire dinscription 310Gnrer un module damorage 311Construction des templates 311Implmenter les actions du module affiliate 312Tester fonctionnellement le formulaire 314

    Dvelopper linterface dadministration des affilis 315Gnrer le module dadministration affiliate 315Paramtrer le module affiliate 316Implmenter les nouvelles fonctionnalits dadministration 317

    Envoyer des e-mails avec Zend_Mail 320Installer et configurer le framework Zend 320Implmenter lenvoi dun e-mail lactivationdu compte de laffili 321

    En rsum 32316. DPLOYERUNMOTEURDERECHERCHE.......................325

    Dcouverte de la librairie Zend_Search_Lucene 326Rappels historiques au sujet de Symfony 326Prsentation de Zend Lucene 326Indexer le contenu de Jobeet 327

    Crer et rcuprer le fichier de lindex 327Mettre jour lindex la srialisation dune offre 328

    Scuriser la srialisation dune offre laidedune transaction Doctrine 330Effacer lindex lors de la suppression dune offre 331Manipuler lindex des offres demploi 331

    Rgnrer tout lindex des offres demploi 331Implmenter la recherche dinformations pour Jobeet 331

    Tester la mthode getForLuceneQuery() de JobeetJob 334Nettoyer rgulirement lindex des offres primes 335En rsum 337

    17. DYNAMISERLINTERFACEUTILISATEURAVEC AJAX ......339Choisir un framework JavaScript 340

    Dcouvrir la librairie jQuery 340Tlcharger et installer jQuery 341

    Rcuprer la dernire version stable du projet 341Charger la librairie jQuery sur chaque page du site 341

    Dcouvrir les comportements JavaScript avec jQuery 342Intercepter la valeur saisie par lutilisateur dans le moteur de

    recherche 343

    http://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdf
  • 7/27/2019 Symfony {9782212124941}

    21/509

    Tabledesmatires

    Groupe Eyrolles, 2007 XIX

    Excuter un appel Ajax pour interroger le serveur web 344Cacher dynamiquement le bouton denvoi du formulaire 345

    Informer lutilisateur de lexcution de la requte Ajax 345

    Faire patienter lutilisateur avec un loader 345Dplacer le code JavaScript dans un fichier externe 346

    Manipuler les requtes Ajax dans les actions 347Dterminer que laction provient dun appel Ajax 347Message spcifique pour une recherche sans rsultat 348

    Simuler une requte Ajax avec les tests fonctionnels 349En rsum 349

    18. INTERNATIONALISATIONETLOCALISATION ................. 351

    Que sont linternationalisation et la localisation ? 352Lutilisateur au cur de linternationalisation 353

    Paramtrer la culture de lutilisateur 353Dfinir et rcuprer la culture de lutilisateur 353Modifier la culture par dfaut de Symfony 353Dterminer les langues favorites de lutilisateur 354

    Utiliser la culture dans les URLs 355Transformer le format des URLs de Jobeet 355Attribuer dynamiquement la culture de lutilisateur daprsla configuration de son navigateur 356

    Tester la culture avec des tests fonctionnels 359Mettre jour les tests fonctionnels qui chouent 359Tester les nouvelles implmentations lies la culture 359

    Changer de langue manuellement 360Installer le plug-in sfFormExtraPlugin 361Intgration non conforme du formulaire de changementde langue 361

    Intgration du formulaire de changement de langueavec un composant Symfony 362Dcouvrir les outils dinternationalisation de Symfony 365

    Paramtrer le support des langues, jeux de caractreset encodages 365Traduire les contenus statiques des templates 367

    Utiliser le helper de traduction __() 367Extraire les contenus internationaliss vers un catalogueXLIFF 369

    Traduire des contenus dynamiques 370Le cas des chanes dynamiques simples 371Traduire des contenus pluriels partir du helperformat_number_choice() 372

    Traduire les contenus propres aux formulaires 373Activer la traduction des objets Doctrine 373

    Internationaliser le modle JobeetCategory de la base 374Mettre jour les donnes initiales de test 374

    Surcharger la mthode findOneBySlug() du modleJobeetCategoryTable 375Mthodes raccourcies du comportement I18N 376

    Mettre jour le modle et la route de la catgorie 376Implmenter la mthode findOneBySlugAndCulture()du modle JobeetCategoryTable 377Mise jour de la route category de lapplication frontend 377

    Champs internationaliss dans un formulaire Doctrine 378Internationaliser le formulaire ddition dune catgoriedans le backoffice 378Utiliser la mthode embedI18n() de lobjetsfFormDoctrine 378Internationalisation de linterface du gnrateurdadministration 379Forcer lutilisation dun autre catalogue de traductions 380

    Tester lapplication pour valider le processus de migrationde lI18N 380

    Dcouvrir les outils de localisation de Symfony 381Rgionaliser les formats de donnes dans les templates 381

    Les helpers du groupe Date 381

    Les helpers du groupe Number 381Les helpers du groupe I18N 382Rgionaliser les formats de donnes dans les formulaires 382

    En rsum 383

    19. LESPLUG-INS .........................................................385Quest-ce quun plug-in dans Symfony ? 386

    Les plug-ins Symfony 386Les plug-ins privs 386

    Les plug-ins publics 387Une autre manire dorganiser le code du projet 387Dcouvrir la structure de fichiers dun plug-in Symfony 387

    Crer le plug-in sfJobeetPlugin 388Migrer les fichiers du modle vers le plug-in 389

    Dplacer le schma de description de la base 389Dplacer les classes du modle, de formulaireset de filtres 389Transformer les classes concrtes en classes abstraites 389

    Reconstruire le modle de donnes 390Supprimer les classes de base des formulaires Doctrine 392Dplacer la classe Jobeet vers le plug-in 392

    Migrer les contrleurs et les vues 393Dplacer les modules vers le plug-in 393Renommer les noms des classes dactions et de composants 393Mettre jour les actions et les templates 394Mettre jour le fichier de configuration du routage 395Activer les modules de lapplication frontend 397

  • 7/27/2019 Symfony {9782212124941}

    22/509

    Symfony

    MieuxdvelopperenPHPavecSymfony1.2etDoctrine

    Groupe Eyrolles, 2007XX

    Migrer les tches automatiques de Jobeet 398Migrer les fichiers dinternationalisation de lapplication 398Migrer le fichier de configuration du routage 399

    Migrer les ressources Web 399Migrer les fichiers relatifs lutilisateur 399

    Configuration du plug-in 399Dveloppement de la classe JobeetUser 400

    Comparaison des structures des projets et des plug-ins 402Utiliser les plug-ins de Symfony 403

    Naviguer dans linterface ddie aux plug-ins 403Les diffrentes manires dinstaller des plug-ins 404

    Contribuer aux plug-ins de Symfony 405Packager son propre plug-in 405

    Construire le fichier README 405Ajouter le fichier LICENSE 405crire le fichier package.xml 405

    Hberger un plug-in public dans le dpt officiel de Symfony 408En rsum 409

    20. LAGESTIONDUCACHE ............................................ 411Pourquoi optimiser le temps de chargement des pages ? 412Crer un nouvel environnement pour tester le cache 413

    Comprendre la configuration par dfaut du cache 413Ajouter un nouvel environnement cache au projet 414

    Configuration gnrale de lenvironnement cache 414Crer le contrleur frontal du nouvel environnement 414Configurer le nouvel environnement 415

    Manipuler le cache de lapplication 415Configuration globale du cache de lapplication 416

    Activer le cache ponctuellement page par page 416Activation du cache de la page daccueil de Jobeet 416Principe de fonctionnement du cache de Symfony 417Activer le cache de la page de cration dune nouvelle offre 418

    Nettoyer le cache de fichiers 418Activer le cache uniquement pour le rsultat dune action 419

    Exclure la mise en cache du layout 419Fonctionnement de la mise en cache sans layout 420

    Activer le cache des templates partiels et des composants 421

    Configuration du cache 421Principe de fonctionnement de la mise en cache 422Activer le cache des formulaires 423

    Comprendre la problmatique de la mise en cache desformulaires 423Dsactiver la cration du jeton unique 424

    Retirer le cache automatiquement 425Configurer la dure de vie du cache de la page daccueil 425Forcer la rgnration du cache depuis une action 425

    Tester le cache partir des tests fonctionnels 427Activer le cache pour lenvironnement de test 427Tester la mise en cache du formulaire de cration dune

    offre demploi 427En rsum 428

    21. LEDPLOIEMENTENPRODUCTION .............................431Prparer le serveur de production 432

    Vrifier la configuration du serveur web 432Installer lacclrateur PHP APC 433Installer les librairies du framework Symfony 433

    Embarquer le framework Symfony 433

    Garder Symfony jour en temps rel 434Personnaliser la configuration de Symfony 436

    Configurer laccs la base de donnes 436Gnrer les liens symboliques pour les ressources web 436Personnaliser les pages derreur par dfaut 436

    Remplacer les pages derreur interne par dfaut 436Personnaliser les pages derreur 404 par dfaut 437

    Personnaliser la structure de fichiers par dfaut 437Modifier le rpertoire par dfaut de la racine web 437Modifier les rpertoires du cache et des logs 438

    la dcouverte des factories 438Initialisation des objets du noyau grce factories.yml 439Modification du nom du cookie de session 439Remplacer le moteur de stockage des sessionspar une base de donnes 440Dfinir la dure de vie maximale dune session 440Dfinir les objets denregistrement derreur 441

    Dployer le projet sur le serveur de production 442Que faut-il dployer en production ? 442Mettre en place des stratgies de dploiement 442

    Dploiement laide dune connexion SSH et rsync 442Configurer rsync pour exclure certains fichiers dudploiement 443Nettoyer le cache de configuration du serveur deproduction 444

    En rsum 445

    A. LEFORMAT YAML ...................................................447Les donnes scalaires 448

    Les chanes de caractres 448Les nombres 449

    Les entiers 449Les nombres octaux 449Les nombres hexadcimaux 450Les nombres dcimaux 450

    Les nombres exponentiels 450

    http://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://-/?-http://-/?-http://-/?-http://-/?-http://-/?-http://app/CahiersTitres.pdfhttp://-/?-http://-/?-http://-/?-http://-/?-
  • 7/27/2019 Symfony {9782212124941}

    23/509

    Tabledesmatires

    Groupe Eyrolles, 2007 XXI

    Les nombres infinis 450Les valeurs nulles : les NULL 450Les valeurs boolennes 450

    Les dates 451Les collections 451

    Les squences dlments 451Les associations dlments 451

    Les associations simples 451Les associations complexes imbriques 452Combinaison de squences et dassociations 453Syntaxe alternative pour les squences et associations 453

    Les commentaires 454Les fichiers YAML dynamiques 454Exemple complet rcapitulatif 455

    B. LEFICHIERDECONFIGURATIONSETTINGS.YML.............. 457Les paramtres de configuration du fichier settings.yml 458

    Configuration de la section .actions 458Configuration de la section .settings 458

    La sous-section .actions 459Configuration par dfaut 459error_404 460login 460secure 460module_disabled 460

    La sous-section .settings 460escaping_strategy 460escaping_method 461csrf_secret 461

    charset 461enabled-modules 462default_timezone 462cache 462etag 462i18n 463default_culture 463standard_helpers 463no_script_name 463

    logging_enabled 464web_debug 464error_reporting 464compressed 464use_database 465check_lock 465check_symfony_version 465web_debug_dir 465

    strip_comments 466max_forwards 466

    C. LEFICHIERDECONFIGURATIONFACTORIES.YML ............467Introduction la notion de factories 468Prsentation du fichier factories.yml 468

    Configuration du service request 468Configuration du service response 469Configuration du service user 469Configuration du service storage 469Configuration du service i18n 470Configuration du service routing 470

    Configuration du service logger 470Le service request 471

    Configuration par dfaut 471path_info_array 471path_info_key 471formats 472relative_root_url 472

    Le service response 472Configuration par dfaut 472send_http_headers 472charset 473http_protocol 473

    Le service user 473Configuration par dfaut 473timeout 474use_flash 474default_culture 474

    Le service storage 474Configuration par dfaut 474auto_start 475session_name 475Paramtres de la fonction session_set_cookie_params() 475session_cache_limiter 475Options de stockage des sessions en bases de donnes 476

    Le service view_cache_manager 476Le service view_cache 476

    Le service i18n 477Le service routing 478Le service logger 480Le service controller 481Les services de cache anonymes 482

    INDEX ......................................................................483

  • 7/27/2019 Symfony {9782212124941}

    24/509

    Groupe Eyrolles, 2008

    chapitre1

  • 7/27/2019 Symfony {9782212124941}

    25/509

    Groupe Eyrolles, 2008

    Dmarrage du projet

    Un projet web ncessite ds le dmarrage une plate-formede dveloppement complte dans la mesure o de nombreusestechnologies interviennent et cohabitent ensemble.Ce chapitre introduit les notions lmentaires de projetSymfony, denvironnements web, de configuration de serveurvirtuel mais aussi de gestion du code source au moyen doutilscomme Subversion.

    MOTS-CLS :

    B Symfony, Apache, SubversionB Vulnrabilits XSS et CSRFB Bonnes pratiques

    de dveloppement

    http://app/CahiersTitres.pdf
  • 7/27/2019 Symfony {9782212124941}

    26/509

    Symfony

    MieuxdvelopperenPHPavecSymfony1.2etDoctrine

    Groupe Eyrolles, 20082

    Comme pour tout projet web, il est vident de ne pas se lancer ttebaisse dans le dveloppement de lapplication, cest pourquoi aucuneligne de code PHP ne sera dvoile avant le troisime chapitre de cetouvrage. Nanmoins, ce chapitre rvlera combien il est bnfique etutile de profiter dun framework comme Symfony seulement en crantun nouveau projet.

    Lobjectif de ce chapitre est de mettre en place lenvironnement de travailet dafficher dans le navigateur une page gnre par dfaut par Sym-fony. Par consquent, il sera question de linstallation du frameworkSymfony, puis de linitialisation de la premire application mais aussi de

    la configuration adquate du serveur web local. Pour finir, une sectiondtaillera pas pas comment installer rapidement un dpt Subversioncapable de grer le contrle du suivi du code source du projet.

    Installer et configurer les bases du projet

    Les prrequis techniques pour dmarrerTout dabord, il faut sassurer que lordinateur de travail possde un envi-ronnement de dveloppement web complet compos dun serveur web(Apache par exemple), dune base de donnes (MySQL, PostgreSQL,ou SQLite) et bien videmment de PHP en version 5.2.4 ou suprieure.

    Tout au long du livre, la ligne de commande permettra de raliser de trsnombreuses tches. Elle sera particulirement facile apprhender sur un

    environnement de type Unix. Pour les utilisateurs sous environnementWindows, pas de panique, puisquil sagit juste de taper quelques com-mandes aprs avoir dmarr lutilitaire cmd (Dmarrer > Excuter > cmd).

    Ce livre tant une introduction au framework Symfony, les notions rela-tives PHP 5 et la programmation oriente objet sont considrescomme acquises.

    Installer les librairies du framework SymfonyLa premire tape technique de ce projet dmarre avec linstallation deslibrairies du framework Symfony. Pour commencer, le dossier danslequel figureront tous les fichiers du projet doit tre cr. Les utilisateursde Windows et dUnix disposent tous de la mme commande mkdirpour y parvenir.

    ASTUCE Installer une plate-formede dveloppement pour Windows

    Des outils comme WAMP Server 2(www.wampserver.com ) sous Windows per-mettent dinstaller en quelques clics un environne-ment Apache, PHP et MySQL complet utilisant lesdernires versions de PHP. Ils permettent ainsi dedmarrer immdiatement le dveloppement deprojets PHP sans avoir se proccuper de linstal-lation des diffrents serveurs.

    REMARQUE Bnficier des outilsdUnix sous Windows

    Si vous souhaitez reproduire un environnementUnix sous Windows, et avoir la possibilit dutiliserdes utilitaires comme tar, gzip ou grep, vouspouvez installer Cygwin (http://cygwin.com).La documentation officielle est un peu restreinte,

    mais vous trouverez un trs bon guide dinstalla-tion ladresse http://www.soe.ucsc.edu/~you/notes/cygwin-install.html. Si vous tesun peu plus aventurier dans lme, vous pouvezmme essayer Windows Services for Unix ladresse http://technet.microsoft.com/en-gb/interopmigration/bb380242.aspx.

    http://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdf
  • 7/27/2019 Symfony {9782212124941}

    27/509

    1

    Dmarrageduprojet

    Groupe Eyrolles, 2008 3

    Cration du dossier du projet en environnement Unix

    Cration du dossier du projet en environnement Windows

    Une fois le rpertoire du projet cr, le rpertoire lib/vendor/ contenantles librairies de Symfony doit son tour tre construit dans le rpertoire

    du projet.Cration du rpertoire lib/vendor/ du projet

    La page dinstallation de Symfony (http://www.symfony-project.org/installation) sur le site officiel du projet liste et compare les diffrentesversions disponibles du framework. Ce livre a t crit pour fonctionner

    avec la toute dernire version 1.2 de Symfony. lheure o sont critesces lignes, la dernire version de Symfony disponible est la 1.2.5.

    La section Source Download de cette page propose un lien permettant detlcharger une archive des fichiers source de Symfony au format .tgz ou.zip. Cette archive doit tre tlcharge dans le rpertoire lib/vendor/qui vient dtre cr, puis dcompresse dans ce mme rpertoire.

    Installation des fichiers sources de Symfony dans le rpertoire lib/vendor/

    Sous Windows, il est plus facile dutiliser lexplorateur de fichiers pourdcompresser larchive au format ZIP. Aprs avoir renomm le rper-toire en symfony, la structure du projet devrait ressembler celle-ci :c:\development\sfprojects\jobeet\lib\vendor\symfony .

    La configuration par dfaut de PHP variant normment dune installa-tion une autre, il convient de sassurer que la configuration du serveurcorrespond aux prrequis minimaux de Symfony. Pour ce faire, le scriptde vrification fourni avec Symfony doit tre excut depuis la ligne decommande.

    $ mkdir -p /home/sfprojects/jobeet

    $ cd /home/sfprojects/jobeet

    c:\> mkdir c:\development\sfprojects\jobeetc:\> cd c:\development\sfprojects\jobeet

    $ mkdir -p /lib/vendor

    $ cd lib/vendor$ tar zxpf symfony-1.2.5.tgz$ mv symfony-1.2.5 symfony$ rm symfony-1.2.5.tgz

    ASTUCE viter les cheminscontenant des espaces

    Pour des raisons de simplicit et defficacit dansla ligne de commande Windows, il est vivementrecommand aux utilisateurs denvironnementsMicrosoft dinstaller le projet et dexcuter lescommandes Symfony dans un chemin qui ne con-

    tient aucun espace. Par consquent, les rpertoiresDocuments and Settings ou encore MyDocuments sont proscrire.

    e

    http://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdf
  • 7/27/2019 Symfony {9782212124941}

    28/509

    Symfony

    MieuxdvelopperenPHPavecSy

    mfony1.2etDoctrine

    Groupe Eyrolles, 20084

    Vrification de la configuration du serveur

    En cas de problme, le script rapportera toutes les informations nces-saires pour corriger lerreur. Il faut galement excuter ce script depuis lenavigateur web puisque la configuration de PHP peut tre diffrente enfonction des deux environnements. Il suffit pour cela de copier le scriptquelque part sous la racine web et daccder ce fichier avec le naviga-teur. Il ne faut pas oublier ensuite de le supprimer une fois la vrificationtermine.

    Une fois la configuration du serveur valide, il ne reste plus qu vrifierque Symfony fonctionne correctement en ligne de commande en utili-sant le script symfony pour afficher la version du framework. Attention,

    cet excutable prend un V majuscule en paramtre.

    Sous Windows :

    $ cd ../..$ php lib/vendor/symfony/data/bin/check_configuration.php

    $ rm web/check_configuration.php

    Figure 11Rsultat du contrle

    de la configuration du serveur

    $ php lib/vendor/symfony/data/bin/symfony -V

    c:> cd ..\..c:> php lib\vendor\symfony\data\bin\symfony -V

    et

    http://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdf
  • 7/27/2019 Symfony {9782212124941}

    29/509

    1

    Dmarrageduproje

    Groupe Eyrolles, 2008 5

    Lexcution du script symfony sans paramtre donne lensemble des pos-sibilits offertes par cet utilitaire. Le rsultat obtenu dresse la liste destches automatises et des options offertes par le framework pour acc-

    lrer les dveloppements.

    Sous Windows :

    Cet utilitaire est le meilleur ami du dveloppeur Symfony. Il fournit de

    nombreux outils permettant damliorer la productivit des activitsrcurrentes comme la suppression du cache, la gnration de code, etc.

    Installation du projetDans Symfony, les applicationspartagent le mme modle de donnes etsont regroupes en projet. Le projet Jobeetaccueillera deux applicationsau total. La premire, nommefrontend, est lapplication qui sera visible

    par tous les utilisateurs, tandis que la seconde, intitule backend, est cellequi permettra aux administrateurs de grer le site.

    Gnrer la structure de base du projetPour linstant, seules les librairies du framework Symfony sont installesdans le rpertoire du projet, mais ce dernier ne dispose pas encore desfichiers et rpertoires qui lui sont propres. Il faut donc demander Sym-fony de btir toute la structure de base du projet comprenant de nom-breux fichiers et rpertoires qui seront tous tudis au fur et mesure deschapitres de cet ouvrage. La commande generate:project de lexcu-table symfony permet de crer ladite structure du projet.

    Sous Windows :

    La tche generate:project gnre la structure par dfaut des rpertoireset cre les fichiers ncessaires un projet Symfony. Le tableau ci-dessousdresse la liste des diffrents rpertoires crs.

    $ php lib/vendor/symfony/data/bin/symfony

    c:> php lib\vendor\symfony\data\bin\symfony

    $ php lib/vendor/symfony/data/bin/symfony generate:project jobeet

    c:\> php lib\vendor\symfony\data\bin\symfony generate:project jobeet

    ne

    http://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdfhttp://app/CahiersTitres.pdf
  • 7/27/2019 Symfony {9782212124941}

    30/509

    Symfony

    MieuxdvelopperenPHPavecSy

    mfony1.2etDoctrin

    Groupe Eyrolles, 20086

    La tche generate:project a galement cr un raccourci symfony laracine du projet Jobeet pour faciliter lcriture de la commandelorsquune tche doit tre excute. partir de maintenant, au lieu duti-liser le chemin complet pour excuter la commande symfony, il s