Symfony2 - Un Framework PHP 5 Performant
Upcoming SlideShare
Loading in...5
×
 

Symfony2 - Un Framework PHP 5 Performant

on

  • 9,342 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,342
Views on SlideShare
7,642
Embed Views
1,700

Actions

Likes
7
Downloads
179
Comments
0

20 Embeds 1,700

http://www.novaway.fr 981
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 5
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 !