• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
Symfony2 - Un Framework PHP 5 Performant
 

Symfony2 - Un Framework PHP 5 Performant

on

  • 9,254 views

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 ...

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.

Statistics

Views

Total Views
9,254
Views on SlideShare
7,556
Embed Views
1,698

Actions

Likes
7
Downloads
178
Comments
0

20 Embeds 1,698

http://www.novaway.fr 980
http://www.symfony.es 479
http://blog.ludikreation.com 74
http://event.lafermeduweb.net 35
http://wiki.ideotechnologies.com 30
http://www.scoop.it 25
http://www.sfexception.com 23
http://v2.novaway.fr 21
http://paper.li 8
http://planet.ludikreation.com 6
http://symfony.es 4
http://www.techgig.com 3
https://twitter.com 2
http://m.novaway.fr 2
url_unknown 1
http://static.slidesharecdn.com 1
http://www.slideshare.net 1
http://www.onlydoo.com 1
http://djo.novaway.dev.novaway.net 1
http://twitter.com 1
More...

Accessibility

Categories

Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    Symfony2 - Un Framework PHP 5 Performant Symfony2 - Un Framework PHP 5 Performant Presentation Transcript

    • Construire des applications web performantes et élégantes avec Symfony2
      @hhamon - WebEventLa Ferme du Web – Lyon – 7 mai 2011
    • R&D
      Audit & Conseil
      Media
      Formation & Coaching
      Développement
    • Composants indépendants et découplés du framework…
    • Framework « full-stack » autour de ces composants.
    • Bundles
      Métiers
      Bundles Tiers
      Configuration
      Bundles Standards
      Core Bundles + Bridges
      Composants
      Bibliothè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 standards
      et bonnes pratiques
      • RFC2616
      • PHPUnit
      • Jinja Templates
      • Spring Security
      • Design Patterns
    • Simplifier l’installation et la configuration
      http://symfony.com/download
    • Distributions disponibles
      Té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 brute
      classDefaultControllerextends Controller
      {
      /** @Route("/hello/{name}") */
      public functionindexAction($name)
      {
      // ... do things with $name
      returnnewResponse('Hello '. $name);
      }
      }
    • Générer un template
      classDefaultControllerextends Controller
      {
      /** @Route("/hello/{name}") */
      public functionindexAction($name)
      {
      // ... do things with $name
      return $this->render(
      'AcmeHelloBundle:Default:index.html.twig',
      array('name'=> $name)
      );
      }
      }
    • Puissance des annotations
      classDefaultControllerextends 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 templateTwig
      Twigest un moteur de templatingmoderne
      • Rapide
      • Syntaxe concise et riche
      • Echappement automatique
      • Fonctionnalités modernes
      • Extensible
      • Flexible
    • Hé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 template
      base.html.twig
      layout.html.twig
      index.html.twig
    • Simplifier la définition des URLs
    • URLs propres
      Les URLsclassiques
      ça craint !!!
    • URLs propres
      Système de routage natif
    • URL propres
      classDefaultControllerextends 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ètres
      classDefaultControllerextends Controller
      {
      /**
      * @Route("/talk/{id}")
      * @Template
      */
      public functionshowAction(Talk $talk)
      {
      returnarray('talk'=> $talk);
      }
      }
    • Simplifier le Débogage
    • La barre de débogage
      Memory
      Queries
      Recorded logs
      Timers
      Currentenvironment
      Currentresponse
      Symfony2 version
      PHP 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 2
      • 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)
    • 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 BDD
      classTalkControllerextends 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 validation
      des données
    • Validation
      • POPOs
      • Annotations
      • Extensible
      • Formulaires
    • Valider des objets PHP
      classContactRequest
      {
      /** @NotBlank*/
      public $message;
      /**
      * @Email
      * @NotBlank
      */
      public $sender;
      }
    • Simplifier
      la gestion des formulaires
    • Traitement des formulaires
      • Valider des objets de Domaine
      • Protection CSRF
      • Validation
      • Templating avec Twig
    • classShopControllerextends 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 formulaire
      public 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
    • Simplifier les tests fonctionnels
    • Tests fonctionnels
      Simuler un véritable navigateur et réaliser des parcours de navigation sur l’application
    • Tests Fonctionnels
      classDefaultControllerTestextendsWebTestCase
      {
      public functiontestIndex()
      {
      $client = $this->createClient();
      $crawler = $client->request('GET', '/schedule');
      $this->assertTrue(
      $crawler->filter('html:contains("Fabien")')->count() >0
      );
      $response = $client->getResponse();
      $this->assertTrue($response->headers->has('expires'));
      }
      }
    • Simplifier le cache des pages
    • Expiration & Validation
    • Expiration avec Expires
      classDefaultControllerextends Controller
      {
      /**
      * @Route("/schedule")
      * @Template
      * @Cache(expires="tomorrow")
      */
      public functionindexAction()
      {
      $title='Confoo 2011 Conferences Schedule';
      returnarray('title'=> $title);
      }
      }
    • Expiration avec Cache-Control
      classDefaultControllerextends Controller
      {
      /**
      * @Route("/schedule")
      * @Template
      * @Cache(maxage="20")
      */
      public functionindexAction()
      {
      $title='Confoo 2011 Conferences Schedule';
      returnarray('title'=> $title);
      }
      }
    • PHP
      Varnish
      Squid
    • EdgeSideIncludes
      <esi:includesrc="http://..." />
    • Authentification Authorization
    • Merci !
      Sensio Labs recrute !