Download - retour sur confoo2011 et Symfony2
![Page 1: retour sur confoo2011 et Symfony2](https://reader036.vdocuments.mx/reader036/viewer/2022062513/55700575d8b42a84618b5388/html5/thumbnails/1.jpg)
Confoo 2011
Saad Tazi
![Page 2: retour sur confoo2011 et Symfony2](https://reader036.vdocuments.mx/reader036/viewer/2022062513/55700575d8b42a84618b5388/html5/thumbnails/2.jpg)
Au programme…
• Symfony2• Caching, ESI• Autres informations Confoo
• Des questions? Quand vous voulez!
![Page 3: retour sur confoo2011 et Symfony2](https://reader036.vdocuments.mx/reader036/viewer/2022062513/55700575d8b42a84618b5388/html5/thumbnails/3.jpg)
Introduction
• “Un autre framework MVC PHP (encore??)”• Bati à partir de composants réutilisables
(Yaml, Dependency Injection Container, Twig…)
• Full-stack framework (pas micro – voir silex)
![Page 4: retour sur confoo2011 et Symfony2](https://reader036.vdocuments.mx/reader036/viewer/2022062513/55700575d8b42a84618b5388/html5/thumbnails/4.jpg)
![Page 5: retour sur confoo2011 et Symfony2](https://reader036.vdocuments.mx/reader036/viewer/2022062513/55700575d8b42a84618b5388/html5/thumbnails/5.jpg)
Différence avec symfony 1• Entièrement réécrit• Beaucoup d’apprentissage avec symfony 1 => meilleure
pratique dans Symfony 2• Pas de séparation entre plusieurs apps
– Supprime les problèmes de routing entre applications– mais en bundle si nécessaire
• Caching HTTP (on va en parler juste après…)• Utilisation des namespace php 5.3• Mon “feeling”: courbe d’apprentissage plus importante,
moins de “magie”, beaucoup plus de Design Patterns appliqués (DIC, decoupling…)
![Page 6: retour sur confoo2011 et Symfony2](https://reader036.vdocuments.mx/reader036/viewer/2022062513/55700575d8b42a84618b5388/html5/thumbnails/6.jpg)
Introduction
• http://symfony.com • Qui a travaillé avec symfony (1)? Un autre
framework PHP?
![Page 7: retour sur confoo2011 et Symfony2](https://reader036.vdocuments.mx/reader036/viewer/2022062513/55700575d8b42a84618b5388/html5/thumbnails/7.jpg)
Une image vaut 1000 mots…
Structure de Symfony (code)
![Page 8: retour sur confoo2011 et Symfony2](https://reader036.vdocuments.mx/reader036/viewer/2022062513/55700575d8b42a84618b5388/html5/thumbnails/8.jpg)
Structure
![Page 9: retour sur confoo2011 et Symfony2](https://reader036.vdocuments.mx/reader036/viewer/2022062513/55700575d8b42a84618b5388/html5/thumbnails/9.jpg)
Structure
• Est-ce que j’ai parlé de:– Config– Routing– Vendors
• Swiftmailer• Doctrine 2• Monolog (et non Zend)
![Page 10: retour sur confoo2011 et Symfony2](https://reader036.vdocuments.mx/reader036/viewer/2022062513/55700575d8b42a84618b5388/html5/thumbnails/10.jpg)
De la requête à la réponse
1. Une requête est reçue par le front controller de Symfony
2. Le routing détermine quelle action est appelée
3. L’action est exécutée4. L’action retourne une réponse• En un mot, Symfony est en charge de convertir
une requête en réponse.
![Page 11: retour sur confoo2011 et Symfony2](https://reader036.vdocuments.mx/reader036/viewer/2022062513/55700575d8b42a84618b5388/html5/thumbnails/11.jpg)
Front Controller
•Très simple•Toute requête passe par le front controller
![Page 12: retour sur confoo2011 et Symfony2](https://reader036.vdocuments.mx/reader036/viewer/2022062513/55700575d8b42a84618b5388/html5/thumbnails/12.jpg)
routing
1. Une requête est reçue par le front controller de Symfony
2. Le routing détermine quelle action est appelée
3. L’action est exécutée4. L’action retourne une réponse• En un mot, Symfony est en charge de convertir
une requête en réponse.
![Page 13: retour sur confoo2011 et Symfony2](https://reader036.vdocuments.mx/reader036/viewer/2022062513/55700575d8b42a84618b5388/html5/thumbnails/13.jpg)
Routing (2)
• Dans app/config/routing.yml:
• Dans DemoController.php:
![Page 14: retour sur confoo2011 et Symfony2](https://reader036.vdocuments.mx/reader036/viewer/2022062513/55700575d8b42a84618b5388/html5/thumbnails/14.jpg)
Routing (3)
• Diffrérentes approches possibles (combinées)• Yaml• Php• Annotation• Xml
• Avantage par rapport à Symfony 1• Plus flexible• Inclusion de règles externes (Bundles… slide
suivantes)
![Page 15: retour sur confoo2011 et Symfony2](https://reader036.vdocuments.mx/reader036/viewer/2022062513/55700575d8b42a84618b5388/html5/thumbnails/15.jpg)
Bundles
• Un bundle est un répertoire avec une structure prédéfinie, qui contient des classes, des controlleurs, des templates et des ressources (images, css…), des règles de routing
• Remplace les plugins… mais en plus générique – Configuration, routing par bundle possible
![Page 16: retour sur confoo2011 et Symfony2](https://reader036.vdocuments.mx/reader036/viewer/2022062513/55700575d8b42a84618b5388/html5/thumbnails/16.jpg)
Action
1. Une requête est reçue par le front controller de Symfony
2. Le routing détermine quelle action est appelée
3. L’action est exécutée4. L’action retourne une réponse• En un mot, Symfony est en charge de convertir
une requête en réponse.
![Page 17: retour sur confoo2011 et Symfony2](https://reader036.vdocuments.mx/reader036/viewer/2022062513/55700575d8b42a84618b5388/html5/thumbnails/17.jpg)
Action (2)
Ou (plus “verbose”):return $this->render(’EcmaBundle:Demo:hello.twig',
array('name' => $name));
Le C du MVC
![Page 18: retour sur confoo2011 et Symfony2](https://reader036.vdocuments.mx/reader036/viewer/2022062513/55700575d8b42a84618b5388/html5/thumbnails/18.jpg)
Twig
• Le V du MVC
• Template engine• Inspiré de Jinja, template engine Python• Rapide, car compilé en PHP• Supporte l’héritage• Pas obligatoire avec Symfony 2
![Page 19: retour sur confoo2011 et Symfony2](https://reader036.vdocuments.mx/reader036/viewer/2022062513/55700575d8b42a84618b5388/html5/thumbnails/19.jpg)
Twig (2)
(asset, block title (défaut), block content, extends)
![Page 20: retour sur confoo2011 et Symfony2](https://reader036.vdocuments.mx/reader036/viewer/2022062513/55700575d8b42a84618b5388/html5/thumbnails/20.jpg)
D’autres fonctionnalités…
![Page 21: retour sur confoo2011 et Symfony2](https://reader036.vdocuments.mx/reader036/viewer/2022062513/55700575d8b42a84618b5388/html5/thumbnails/21.jpg)
Web Debug Toolbar
• Similaire à la debug toolbar de symfony 1• Activable par environnement (dev, prod…)
![Page 22: retour sur confoo2011 et Symfony2](https://reader036.vdocuments.mx/reader036/viewer/2022062513/55700575d8b42a84618b5388/html5/thumbnails/22.jpg)
Profiler
![Page 23: retour sur confoo2011 et Symfony2](https://reader036.vdocuments.mx/reader036/viewer/2022062513/55700575d8b42a84618b5388/html5/thumbnails/23.jpg)
Console
![Page 24: retour sur confoo2011 et Symfony2](https://reader036.vdocuments.mx/reader036/viewer/2022062513/55700575d8b42a84618b5388/html5/thumbnails/24.jpg)
Doctrine 2• Le M du MVC (“enfin!”)
• ORM / ODM au dessus de PDO• Data Mapper Design Pattern au lieu de Active Record
– Pas nécessaire que les Classes Modèles héritent d’une classe parent
– Une classe qui s’occupe de faire les actions DB (Mapper - classe générée automatiquement)
• Support de MongoDB (ODM) et CouchDB et…
![Page 25: retour sur confoo2011 et Symfony2](https://reader036.vdocuments.mx/reader036/viewer/2022062513/55700575d8b42a84618b5388/html5/thumbnails/25.jpg)
Doctrine 2 (2)
Annotation, XML, YAML pour définir les Entités (= les classes Modèles)
![Page 26: retour sur confoo2011 et Symfony2](https://reader036.vdocuments.mx/reader036/viewer/2022062513/55700575d8b42a84618b5388/html5/thumbnails/26.jpg)
Tests
• PHPUnit + classe WebTestCase + le Crawler Component
• Permet de:– simuler des requêtes HTTP, – Faire des “back”, – Soumettre des formulaires…
• http://symfony.com/doc/2.0/book/testing.html#the-test-client
![Page 27: retour sur confoo2011 et Symfony2](https://reader036.vdocuments.mx/reader036/viewer/2022062513/55700575d8b42a84618b5388/html5/thumbnails/27.jpg)
Tests (2)
![Page 28: retour sur confoo2011 et Symfony2](https://reader036.vdocuments.mx/reader036/viewer/2022062513/55700575d8b42a84618b5388/html5/thumbnails/28.jpg)
Cache
GET (Etag, ...)
OUI
Cache existe? valide?
NON
![Page 29: retour sur confoo2011 et Symfony2](https://reader036.vdocuments.mx/reader036/viewer/2022062513/55700575d8b42a84618b5388/html5/thumbnails/29.jpg)
• But: ne pas “frapper” le serveur Web à chaque appel• HTTP RFC 2616 Compliant• Expiration
– Expires=Date• Surtout pour ce qui est statique (synchronisation)
– Cache-control: Maxage=20, s-maxage=20 (seconds)• Validation
– Etag / if none match– Last-modified / if modified since
• Inséré par le cache• (retourne un 304 not modified)
Cache (2)
![Page 30: retour sur confoo2011 et Symfony2](https://reader036.vdocuments.mx/reader036/viewer/2022062513/55700575d8b42a84618b5388/html5/thumbnails/30.jpg)
Cache (3)
Front Controller:
Sans cache
Avec cache
![Page 31: retour sur confoo2011 et Symfony2](https://reader036.vdocuments.mx/reader036/viewer/2022062513/55700575d8b42a84618b5388/html5/thumbnails/31.jpg)
• Dans Symfony2– La classe AppCache peut avoir les headers par défaut– Chaque action peut (re)définir les “headers de cache”– On peut “wrapper” le framework par un système de cache
PHP (pour tester)– On peut utiliser Varnish ou Akamai ou NGINX comme
reverse Proxy (ou Cache Proxy) en avant du serveur Web
– Mais comment mettre en cache le “welcome User 1” dans le header par exemple?...
Cache (4)
![Page 32: retour sur confoo2011 et Symfony2](https://reader036.vdocuments.mx/reader036/viewer/2022062513/55700575d8b42a84618b5388/html5/thumbnails/32.jpg)
• ESI: Edge Side Include
• Le reverse proxy fait un appel si nécessaire• Avec Symfony2: un helper:
Cache (5)
![Page 33: retour sur confoo2011 et Symfony2](https://reader036.vdocuments.mx/reader036/viewer/2022062513/55700575d8b42a84618b5388/html5/thumbnails/33.jpg)
• Framework moderne, flexible, puissant• dynamise la communauté PHP
– Doctine 2– Symfony Component– Dependency Injection– Twig– Monolog– Silex (à la Sinatra ou nodejs…)– http://groups.google.com/group/php-standards/web/psr-0-final-proposal
• Documentation: bonne, mais manque un jobeet• Stabilité: en pre-release depuis quelques temps…(j’ai
omis le Form framework pour une raison…)• (les dernières nouvelles…)
En résumé
![Page 34: retour sur confoo2011 et Symfony2](https://reader036.vdocuments.mx/reader036/viewer/2022062513/55700575d8b42a84618b5388/html5/thumbnails/34.jpg)
Et le reste de confoo?
![Page 35: retour sur confoo2011 et Symfony2](https://reader036.vdocuments.mx/reader036/viewer/2022062513/55700575d8b42a84618b5388/html5/thumbnails/35.jpg)
HTML5
• Très présent, même si on utilise HTML5 pour plus…• Librairie Javascript, SVG, …
• Nombreuses conférences, de Mozilla, Microsoft…• Quoi faire avec les anciens browsers:
• Polyfills https://github.com/Modernizr/Modernizr/wiki/HTML5-Cross-browser-Polyfills
• Quels éléments HTML5 sont “production ready”• Video http://craftymind.com/factory/html5video/CanvasVideo.html • localStorage• WebSocket (lien avec Nodejs plus loin ;-))• File API• SVG, Canvas…
• Pas prêt• EmbedDB• Drag & Drop…
![Page 36: retour sur confoo2011 et Symfony2](https://reader036.vdocuments.mx/reader036/viewer/2022062513/55700575d8b42a84618b5388/html5/thumbnails/36.jpg)
Server-Side Javascript
• Nodejs– Javascript v8 de google– Très rapide
• v8 en moyenne 8x plus rapide que PHP(de http://shootout.alioth.debian.org/)
– Non bloquant• Similaire à:
$(selector).click(function() {…});• Mais pour tout: requête DB, routing…
– Pas encore complétement stable (0.4.6) ni “scalable”– Gros buzz– Express, npm, socket.io
![Page 37: retour sur confoo2011 et Symfony2](https://reader036.vdocuments.mx/reader036/viewer/2022062513/55700575d8b42a84618b5388/html5/thumbnails/37.jpg)
Clean PHP
• Du créateur de PHPUnit• Des principes de base que les développeurs ont tendance à oublier• KISS – Keep it simple stupid• beware of optimizations
• optimiser seulement si nécessaire, après benchmark
• DRY – don’t repeat yourself• principle of least astonishment
• Exemple: pas de getter qui change l’état!
• Separation of concerns• Si on n’utilise pas de “ET” pour décrire une classe!• Active record vs. Data Mapper
• the boy scout rule• Laisser le code plus “propre” qu’avant de l’avoir modifié
• Reviews (peer), Automated testing, refactoring, tell don’t ask…
![Page 38: retour sur confoo2011 et Symfony2](https://reader036.vdocuments.mx/reader036/viewer/2022062513/55700575d8b42a84618b5388/html5/thumbnails/38.jpg)
Hidden Features of PHP
• Spl: SplIterator, SplQueue (RabbitMQ)• StatGrab: CPU, RAM, Disk stats, …• igbinary (sur github)
– Plus rapide et plus efficace que le serialize• Session plus aléatoire:
– session.entropy_file: / dev/urandomsession.entropy_length = 32
![Page 39: retour sur confoo2011 et Symfony2](https://reader036.vdocuments.mx/reader036/viewer/2022062513/55700575d8b42a84618b5388/html5/thumbnails/39.jpg)
Autres notes
• “Varnish in action”• XHProf:
– de facebook (opensource)– Profiler php sur le serveur de production
• NoSQL– MongoDB, CouchDB, Cassandra
• Hiphop (facebook)• Jenkins, xdebug (cachegrind, profiling), Alloy
framework, Sinatra…
![Page 40: retour sur confoo2011 et Symfony2](https://reader036.vdocuments.mx/reader036/viewer/2022062513/55700575d8b42a84618b5388/html5/thumbnails/40.jpg)
Merci!
• http://www.evernote.com/pub/saadtazi/confoo
• Questions?