Your SlideShare is downloading. ×
0
Construire des applications web performantes et élégantes avec Symfony2<br />@hhamon - WebEventLa Ferme du Web – Lyon – 7 ...
R&D<br />Audit & Conseil<br />Media<br />Formation & Coaching<br />Développement<br />
Composants indépendants et découplés du framework…<br />
Framework « full-stack » autour de ces composants.<br />
Bundles<br />Métiers<br />Bundles Tiers<br />Configuration<br />Bundles Standards<br />Core Bundles + Bridges<br />Composa...
« Un Bundle est un répertoire qui contient une structure bien précise et qui héberge tous les fichiers d’une même fonction...
Un frameworksimple et unique !<br />
Respectueux des standards<br />et bonnes pratiques<br /><ul><li>RFC2616
PHPUnit
Jinja Templates
Spring Security
Design Patterns</li></li></ul><li>Simplifier l’installation et la configuration<br />http://symfony.com/download<br />
Distributions disponibles<br />Télécharger l’Edition Standardqui héberge le framework, les bibliothèques tierces et les bu...
Configuration simplifiée<br />
Configuration de la base de données.<br />
Démarrage immédiat avec Symfony2.<br />Happy coding<br />
Envie de l’essayer ?<br />
La philosophie de Symfony2<br />« Convertir une Requête entrante en une Réponse »<br />
Générer une réponse brute<br />classDefaultControllerextends Controller<br />{<br />/** @Route("/hello/{name}") */<br />pu...
Générer un template<br />classDefaultControllerextends Controller<br />{<br />/** @Route("/hello/{name}") */<br />public f...
Puissance des annotations<br />classDefaultControllerextends Controller<br />{<br />/**<br />     * @Route("/schedule")<br...
Templating avec Twig<br />{%extends"ConfooConferenceBundle::layout.html.twig"%}<br />{%blockcontent%}<br />    <h1> {{titl...
Le moteur de templateTwig<br />Twigest un moteur de templatingmoderne<br /><ul><li>Rapide
Syntaxe concise et riche
Echappement automatique
Fonctionnalités modernes
Extensible
Flexible</li></li></ul><li>Héritage de template<br />{%extends"ConfooConferenceBundle::layout.html.twig"%}<br />{%block co...
Héritage de template<br />{%extends"::base.html.twig"%}<br />{%blockbody%}<br />    <imgsrc="/images/logo.gif" alt="Confoo...
Héritage de templates<br /><!DOCTYPE html><br /><html><br />    <head><br />        <meta http-equiv="Content-Type" <br />...
Héritage de template<br />base.html.twig<br />layout.html.twig<br />index.html.twig<br />
Simplifier la définition des URLs<br />
URLs propres<br />Les URLsclassiques<br />ça craint !!!<br />
URLs propres<br />Système de routage natif<br />
URL propres<br />classDefaultControllerextends Controller<br />{<br />/**<br />* @Route("/{year}/talk/{month}/{day}/{slug}...
Conversion automatique des paramètres<br />classDefaultControllerextends Controller<br />{<br />/**<br />* @Route("/talk/{...
Simplifier le Débogage<br />
La barre de débogage<br />Memory<br />Queries<br />Recorded logs<br />Timers<br />Currentenvironment<br />Currentresponse<...
Les traces d’exception<br />
Traces d’exception<br />
Journalisation interne<br />
L’application Profiler<br />
L’application Profiler<br />
Simplifier les interactions <br />avec la BDD<br />
Bibliothèque Doctrine 2<br /><ul><li>Abstraction de Base de Données (DBAL)
Mapping Objet Relationnel (ORM)
Support des Migrations
Mapping Objet Document (ODM - MongoDB)
Mapping Objet XML (OXM -XML databases)</li></li></ul><li>Définition des entités Doctrine 2<br />/** @Entity*/<br />class T...
Persistance des entités en BDD<br />classTalkControllerextends Controller<br />{<br />/** @Route("/talks/new") */<br />pub...
Simplifier la validation<br />des données<br />
Validation<br /><ul><li>POPOs
Annotations
Extensible
Formulaires</li></li></ul><li>Valider des objets PHP<br />classContactRequest<br />{<br />/** @NotBlank*/<br />public $mes...
Simplifier <br />la gestion des formulaires<br />
Traitement des formulaires<br /><ul><li>Valider des objets de Domaine
Protection CSRF
Validation
Templating avec Twig</li></li></ul><li>classShopControllerextends Controller<br />{<br />    public functionindexAction()<...
Traitement du formulaire<br />public functionindexAction()<br />{<br />    $product =newProduct();<br />    $form =...;<br...
Prototypage avec Twig<br /><form action="#" method="post"><br />{{form_widget(form)}}<br />    <button type="submit"><br /...
Fonctions de rendu avec Twig<br />
Upcoming SlideShare
Loading in...5
×

Symfony2 - Un Framework PHP 5 Performant

9,152

Published on

L’arrivée de PHP 5.3 en milieu d’année 2009 a bouleversé la manière de développer des applications web. En effet, cette nouvelle version a apporté de nouveaux outils au langage tels que les espaces de nommage qui favorisent la réutilisabilité du code lorsqu’ils sont employés à bon escient. Les nouveaux frameworks de développement rapide ont aussi suivi le mouvement et reposent sur la base de PHP 5.3. C’est le cas de Symfony2 dont la version stable est prévue prochainement.

Cette présentation offre un tour d’horizon de la nouvelle architecture du framework qui s’articule autour de “bundles”, de librairies externes et de nombreux composants indépendants tels que le conteneur d’injection de dépendances. Nous dresserons un panorama des principales fonctionnalités offertes par le framework telles que la couche d’ORM Doctrine 2, le moteur de templating Twig et la gestion des formulaires. Nous nous intéresserons également à la gestion du cache HTTP, à la couche de sécurité ainsi qu’aux outils de débogage destinés à améliorer la productivité du développeur et la maintenance de l’application.

Published in: Technology
0 Comments
7 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
9,152
On Slideshare
0
From Embeds
0
Number of Embeds
9
Actions
Shares
0
Downloads
210
Comments
0
Likes
7
Embeds 0
No embeds

No notes for slide

Transcript of "Symfony2 - Un Framework PHP 5 Performant"

  1. 1. Construire des applications web performantes et élégantes avec Symfony2<br />@hhamon - WebEventLa Ferme du Web – Lyon – 7 mai 2011<br />
  2. 2. R&D<br />Audit & Conseil<br />Media<br />Formation & Coaching<br />Développement<br />
  3. 3.
  4. 4. Composants indépendants et découplés du framework…<br />
  5. 5. Framework « full-stack » autour de ces composants.<br />
  6. 6. Bundles<br />Métiers<br />Bundles Tiers<br />Configuration<br />Bundles Standards<br />Core Bundles + Bridges<br />Composants<br />Bibliothèques<br />
  7. 7. « 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é.  »<br />
  8. 8. Un frameworksimple et unique !<br />
  9. 9. Respectueux des standards<br />et bonnes pratiques<br /><ul><li>RFC2616
  10. 10. PHPUnit
  11. 11. Jinja Templates
  12. 12. Spring Security
  13. 13. Design Patterns</li></li></ul><li>Simplifier l’installation et la configuration<br />http://symfony.com/download<br />
  14. 14. Distributions disponibles<br />Télécharger l’Edition Standardqui héberge le framework, les bibliothèques tierces et les bundles standards<br />
  15. 15. Configuration simplifiée<br />
  16. 16. Configuration de la base de données.<br />
  17. 17. Démarrage immédiat avec Symfony2.<br />Happy coding<br />
  18. 18. Envie de l’essayer ?<br />
  19. 19. La philosophie de Symfony2<br />« Convertir une Requête entrante en une Réponse »<br />
  20. 20. Générer une réponse brute<br />classDefaultControllerextends Controller<br />{<br />/** @Route("/hello/{name}") */<br />public functionindexAction($name)<br /> {<br />// ... do things with $name<br />returnnewResponse('Hello '. $name);<br /> }<br />}<br />
  21. 21. Générer un template<br />classDefaultControllerextends Controller<br />{<br />/** @Route("/hello/{name}") */<br />public functionindexAction($name)<br /> {<br />// ... do things with $name<br />return $this->render(<br />'AcmeHelloBundle:Default:index.html.twig',<br />array('name'=> $name)<br /> );<br /> }<br />}<br />
  22. 22. Puissance des annotations<br />classDefaultControllerextends Controller<br />{<br />/**<br /> * @Route("/schedule")<br />* @Template<br /> */<br />public functionindexAction()<br /> {<br /> $title='WebEvent 2011 Schedule';<br />returnarray('title'=> $title);<br /> }<br />}<br />
  23. 23. Templating avec Twig<br />{%extends"ConfooConferenceBundle::layout.html.twig"%}<br />{%blockcontent%}<br /> <h1> {{title}} </h1><br /> <ul><br /> <li>Caching on the Edge, by Fabien Potencier</li><br /> <li>HipHop for PHP, by Scott Mac Vicar</li><br /> <li>XDebug, by Derick Rethans</li><br /> <li>...</li><br /> </ul><br />{%endblock%}<br />
  24. 24. Le moteur de templateTwig<br />Twigest un moteur de templatingmoderne<br /><ul><li>Rapide
  25. 25. Syntaxe concise et riche
  26. 26. Echappement automatique
  27. 27. Fonctionnalités modernes
  28. 28. Extensible
  29. 29. Flexible</li></li></ul><li>Héritage de template<br />{%extends"ConfooConferenceBundle::layout.html.twig"%}<br />{%block content %}<br /> <h1> {{title}} </h1><br /> <ul><br /> <li>Caching on the Edge, by Fabien Potencier</li><br /> <li>HipHop for PHP, by Scott Mac Vicar</li><br /> <li>XDebug, by Derick Rethans</li><br /> <li>...</li><br /> </ul><br />{%endblock%}<br />index.html.twig<br />
  30. 30. Héritage de template<br />{%extends"::base.html.twig"%}<br />{%blockbody%}<br /> <imgsrc="/images/logo.gif" alt="Confoo 2011"/><br />{%blockcontent%}{%endblock%}<br />{%endblock%}<br />layout.html.twig<br />
  31. 31. Héritage de templates<br /><!DOCTYPE html><br /><html><br /> <head><br /> <meta http-equiv="Content-Type" <br /> content="text/html; charset=utf-8" /><br /> <title>{%blocktitle%}Welcome!{%endblock%}</title><br /> <link rel="shortcut icon" href="{{asset('favicon.ico') }}" /><br /> </head><br /> <body><br />{%blockbody%}{%endblock%}<br /> </body><br /></html><br />base.html.twig<br />
  32. 32. Héritage de template<br />base.html.twig<br />layout.html.twig<br />index.html.twig<br />
  33. 33. Simplifier la définition des URLs<br />
  34. 34. URLs propres<br />Les URLsclassiques<br />ça craint !!!<br />
  35. 35. URLs propres<br />Système de routage natif<br />
  36. 36. URL propres<br />classDefaultControllerextends Controller<br />{<br />/**<br />* @Route("/{year}/talk/{month}/{day}/{slug}")<br /> * @Template<br /> */<br />public functionshowAction($slug, $day, $month, $year)<br /> {<br />// Get a talk objectfrom the database<br />$talk =...;<br />returnarray('talk'=> $talk);<br /> }<br />}<br />
  37. 37. Conversion automatique des paramètres<br />classDefaultControllerextends Controller<br />{<br />/**<br />* @Route("/talk/{id}")<br /> * @Template<br /> */<br />public functionshowAction(Talk $talk)<br />{<br />returnarray('talk'=> $talk);<br /> }<br />}<br />
  38. 38. Simplifier le Débogage<br />
  39. 39. La barre de débogage<br />Memory<br />Queries<br />Recorded logs<br />Timers<br />Currentenvironment<br />Currentresponse<br />Symfony2 version<br />PHP environment<br />
  40. 40. Les traces d’exception<br />
  41. 41. Traces d’exception<br />
  42. 42. Journalisation interne<br />
  43. 43. L’application Profiler<br />
  44. 44. L’application Profiler<br />
  45. 45. Simplifier les interactions <br />avec la BDD<br />
  46. 46. Bibliothèque Doctrine 2<br /><ul><li>Abstraction de Base de Données (DBAL)
  47. 47. Mapping Objet Relationnel (ORM)
  48. 48. Support des Migrations
  49. 49. Mapping Objet Document (ODM - MongoDB)
  50. 50. Mapping Objet XML (OXM -XML databases)</li></li></ul><li>Définition des entités Doctrine 2<br />/** @Entity*/<br />class Talk<br />{<br />/**<br /> * @Id<br /> * @GeneratedValue<br /> * @Column(type="integer")<br /> */<br />public $id;<br />/** @Column(length=80, nullable=false) */<br />public $title;<br />/** @Column(type="datetime") */<br />public $schedule;<br />/** @ManyToMany(targetEntity="Speaker", mappedBy="talks") */<br />public $speakers;<br />}<br />
  51. 51. Persistance des entités en BDD<br />classTalkControllerextends Controller<br />{<br />/** @Route("/talks/new") */<br />public functioncreateAction()<br /> {<br /> $em= $this->get('registry')->getEntityManager();<br /> $talk =newTalk();<br /> $talk->setTitle('Symfony2, a professional framework');<br /> $talk->setSchedule(new DateTime('2011-03-12 16:00'));<br /> $talk->addSpeaker(newSpeaker('Hugo Hamon'));<br /> $talk->addSpeaker(newSpeaker('Fabien Potencier'));<br /> $em->persist($talk);<br /> $em->flush();<br /> }<br />}<br />
  52. 52. Simplifier la validation<br />des données<br />
  53. 53. Validation<br /><ul><li>POPOs
  54. 54. Annotations
  55. 55. Extensible
  56. 56. Formulaires</li></li></ul><li>Valider des objets PHP<br />classContactRequest<br />{<br />/** @NotBlank*/<br />public $message;<br />/**<br /> * @Email<br /> * @NotBlank<br /> */<br />public $sender;<br />}<br />
  57. 57. Simplifier <br />la gestion des formulaires<br />
  58. 58. Traitement des formulaires<br /><ul><li>Valider des objets de Domaine
  59. 59. Protection CSRF
  60. 60. Validation
  61. 61. Templating avec Twig</li></li></ul><li>classShopControllerextends Controller<br />{<br /> public functionindexAction()<br /> {<br /> $product =newProduct();<br /> $product->name ='Test product';<br /> $product->setPrice('50.00');<br /> $form = $this->get('form.factory')<br />->createBuilder('form', $product)<br />->add('name', 'text')<br />->add('price', 'money', array('currency'=>'USD'))<br />->getForm();<br />returnarray('form'=> $form->createView());<br /> }<br />}<br />
  62. 62. Traitement du formulaire<br />public functionindexAction()<br />{<br /> $product =newProduct();<br /> $form =...;<br /> $request = $this->get('request');<br />if ('POST' === $request->getMethod()) {<br /> $form->bindRequest($request);<br />if ($form->isValid()) {<br />// handle data, persist the object to the database...<br /> }<br /> }<br />returnarray('form'=> $form->createView());<br />}<br />
  63. 63. Prototypage avec Twig<br /><form action="#" method="post"><br />{{form_widget(form)}}<br /> <button type="submit"><br /> Create the product<br /> </button><br /></form><br />
  64. 64. Fonctions de rendu avec Twig<br />
  65. 65. Simplifier les tests fonctionnels<br />
  66. 66. Tests fonctionnels<br />Simuler un véritable navigateur et réaliser des parcours de navigation sur l’application<br />
  67. 67. Tests Fonctionnels<br />classDefaultControllerTestextendsWebTestCase<br />{<br />public functiontestIndex()<br /> {<br /> $client = $this->createClient();<br /> $crawler = $client->request('GET', '/schedule');<br /> $this->assertTrue(<br /> $crawler->filter('html:contains("Fabien")')->count() >0<br /> );<br /> $response = $client->getResponse();<br /> $this->assertTrue($response->headers->has('expires'));<br /> }<br />}<br />
  68. 68. Simplifier le cache des pages<br />
  69. 69. Expiration & Validation<br />
  70. 70. Expiration avec Expires<br />classDefaultControllerextends Controller<br />{<br />/**<br /> * @Route("/schedule")<br /> * @Template<br />* @Cache(expires="tomorrow")<br />*/<br />public functionindexAction()<br /> {<br /> $title='Confoo 2011 Conferences Schedule';<br />returnarray('title'=> $title);<br /> }<br />}<br />
  71. 71. Expiration avec Cache-Control<br />classDefaultControllerextends Controller<br />{<br />/**<br /> * @Route("/schedule")<br /> * @Template<br />* @Cache(maxage="20")<br />*/<br />public functionindexAction()<br /> {<br /> $title='Confoo 2011 Conferences Schedule';<br />returnarray('title'=> $title);<br /> }<br />}<br />
  72. 72. PHP<br />Varnish<br />Squid<br />
  73. 73. EdgeSideIncludes<br /><esi:includesrc="http://..." /><br />
  74. 74.
  75. 75.
  76. 76. Authentification Authorization<br />
  77. 77. Merci !<br />Sensio Labs recrute !<br />
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×