Construire des applications web performantes et élégantes avec Symfony2@hhamon - WebEvent  La Ferme du Web – Lyon – 7 mai 2011
R&DAudit & ConseilMediaFormation & CoachingDéveloppement
Composants indépendants et découplés du framework…
Framework « full-stack »
BundlesMétiersBundles TiersConfigurationBundles StandardsCore Bundles + BridgesComposantsBibliothèques
« Un Bundle est un répertoire qui contient une structure bien précise et qui héberge tous les fichiers d’une même fonctionnalité.  »
Un frameworksimple et unique !
Respectueux des standardset bonnes pratiquesRFC2616
PHPUnit
Jinja Templates
Spring Security
Design PatternsSimplifier l’installation et la configurationhttp://symfony.com/download
Distributions disponiblesTélécharger l’Edition Standardqui héberge le framework, les bibliothèques tierces et les bundles standards
Configuration simplifiée
Configuration de la base de données.
Démarrage immédiat avec Symfony2.Happy coding
Envie de l’essayer ?
La philosophie de Symfony2« Convertir une Requête entrante en une Réponse »
Générer une réponse bruteclassDefaultControllerextends Controller{/** @Route("/hello/{name}") */public functionindexAction($name)    {// ... do things with $namereturnnewResponse('Hello '. $name);    }}
Générer un templateclassDefaultControllerextends Controller{/** @Route("/hello/{name}") */public functionindexAction($name)    {// ... do things with $namereturn $this->render('AcmeHelloBundle:Default:index.html.twig',array('name'=> $name)       );    }}
Puissance des annotationsclassDefaultControllerextends Controller{/**     * @Route("/schedule")* @Template     */public functionindexAction()    {        $title='WebEvent 2011 Schedule';returnarray('title'=> $title);    }}
Templating avec Twig{%extends"ConfooConferenceBundle::layout.html.twig"%}{%blockcontent%}    <h1> {{title}} </h1>    <ul>        <li>Caching on the Edge, by Fabien Potencier</li>        <li>HipHop for PHP, by Scott Mac Vicar</li>        <li>XDebug, by Derick Rethans</li>        <li>...</li>    </ul>{%endblock%}
Le moteur de templateTwigTwig est un moteur de templatingmoderneRapide
Syntaxe concise et riche
Echappement automatique
Fonctionnalités modernes
Extensible
FlexibleHéritage de template{%extends"ConfooConferenceBundle::layout.html.twig"%}{%block content %}    <h1> {{title}} </h1>    <ul>        <li>Caching on the Edge, by Fabien Potencier</li>        <li>HipHop for PHP, by Scott Mac Vicar</li>        <li>XDebug, by Derick Rethans</li>        <li>...</li>    </ul>{%endblock%}index.html.twig
Héritage de template{%extends"::base.html.twig"%}{%blockbody%}    <imgsrc="/images/logo.gif" alt="Confoo 2011"/>{%blockcontent%}{%endblock%}{%endblock%}layout.html.twig
Héritage de templates<!DOCTYPE html><html>    <head>        <meta http-equiv="Content-Type"            content="text/html; charset=utf-8" />        <title>{%blocktitle%}Welcome!{%endblock%}</title>        <link rel="shortcut icon" href="{{asset('favicon.ico') }}" />    </head>    <body>{%blockbody%}{%endblock%}    </body></html>base.html.twig
Héritage de templatebase.html.twiglayout.html.twigindex.html.twig
Simplifier la définition des URLs
URLs propresLes URLs classiquesça craint !!!
URLs propresSystème de routage natif
URL propresclassDefaultControllerextends Controller{/*** @Route("/{year}/talk/{month}/{day}/{slug}")     * @Template     */public functionshowAction($slug, $day, $month, $year)    {// Get a talk objectfrom the database$talk =...;returnarray('talk'=> $talk);    }}
Conversion automatique des paramètresclassDefaultControllerextends Controller{/*** @Route("/talk/{id}")     * @Template     */public functionshowAction(Talk $talk){returnarray('talk'=> $talk);    }}
Simplifier le Débogage
La barre de débogageMemoryQueriesRecorded logsTimersCurrentenvironmentCurrentresponseSymfony2 versionPHP environment
Les traces d’exception
Traces d’exception
Journalisation interne
L’application Profiler
L’application Profiler
Simplifier les interactions avec la BDD
Bibliothèque Doctrine 2Abstraction de Base de Données (DBAL)
Mapping Objet Relationnel (ORM)
Support des Migrations
Mapping Objet Document (ODM - MongoDB)
Mapping Objet XML (OXM -XML databases)Définition des entités Doctrine 2/** @Entity*/class Talk{/**     * @Id     * @GeneratedValue     * @Column(type="integer")     */public $id;/** @Column(length=80, nullable=false) */public $title;/** @Column(type="datetime") */public $schedule;/** @ManyToMany(targetEntity="Speaker", mappedBy="talks") */public $speakers;}
Persistance des entités en BDDclassTalkControllerextends Controller{/** @Route("/talks/new") */public functioncreateAction()    {        $em= $this->get('registry')->getEntityManager();        $talk =newTalk();        $talk->setTitle('Symfony2, a professional framework');        $talk->setSchedule(new \DateTime('2011-03-12 16:00'));        $talk->addSpeaker(newSpeaker('Hugo Hamon'));        $talk->addSpeaker(newSpeaker('Fabien Potencier'));        $em->persist($talk);        $em->flush();    }}
Simplifier la validationdes données
ValidationPOPOs
Annotations
Extensible
FormulairesValider des objets PHPclassContactRequest{/** @NotBlank*/public $message;/**     * @Email     * @NotBlank     */public $sender;}
Simplifier la gestion des formulaires
Traitement des formulairesValider des objets de Domaine
Protection CSRF
Validation
Templating avec TwigclassShopControllerextends Controller{    public functionindexAction()    {        $product =newProduct();        $product->name ='Test product';        $product->setPrice('50.00');        $form = $this->get('form.factory')->createBuilder('form', $product)->add('name', 'text')->add('price', 'money', array('currency'=>'USD'))->getForm();returnarray('form'=> $form->createView());    }}
Traitement du formulairepublic functionindexAction(){    $product =newProduct();    $form =...;    $request = $this->get('request');if ('POST' === $request->getMethod()) {        $form->bindRequest($request);if ($form->isValid()) {// handle data, persist the object to the database...        }    }returnarray('form'=> $form->createView());}
Prototypage avec Twig<form action="#" method="post">{{form_widget(form)}}    <button type="submit">    Create the product   </button></form>
Fonctions de rendu avec Twig

Symfony2 - Un Framework PHP 5 Performant