Your SlideShare is downloading. ×
0
Symfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 Performant
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Symfony2 - Un Framework PHP 5 Performant

9,117

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 …

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,117
On Slideshare
0
From Embeds
0
Number of Embeds
9
Actions
Shares
0
Downloads
204
Comments
0
Likes
7
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

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

×