retour sur confoo2011 et Symfony2

Preview:

DESCRIPTION

Présentation interne sur Symfony2, plus notes sur le conférence montréalaise Confoo 2011

Citation preview

Confoo 2011

Saad Tazi

Au programme…

• Symfony2• Caching, ESI• Autres informations Confoo

• Des questions? Quand vous voulez!

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)

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…)

Introduction

• http://symfony.com • Qui a travaillé avec symfony (1)? Un autre

framework PHP?

Une image vaut 1000 mots…

Structure de Symfony (code)

Structure

Structure

• Est-ce que j’ai parlé de:– Config– Routing– Vendors

• Swiftmailer• Doctrine 2• Monolog (et non Zend)

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.

Front Controller

•Très simple•Toute requête passe par le front controller

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.

Routing (2)

• Dans app/config/routing.yml:

• Dans DemoController.php:

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)

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

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.

Action (2)

Ou (plus “verbose”):return $this->render(’EcmaBundle:Demo:hello.twig',

array('name' => $name));

Le C du MVC

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

Twig (2)

(asset, block title (défaut), block content, extends)

D’autres fonctionnalités…

Web Debug Toolbar

• Similaire à la debug toolbar de symfony 1• Activable par environnement (dev, prod…)

Profiler

Console

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…

Doctrine 2 (2)

Annotation, XML, YAML pour définir les Entités (= les classes Modèles)

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

Tests (2)

Cache

GET (Etag, ...)

OUI

Cache existe? valide?

NON

• 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)

Cache (3)

Front Controller:

Sans cache

Avec cache

• 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)

• ESI: Edge Side Include

• Le reverse proxy fait un appel si nécessaire• Avec Symfony2: un helper:

Cache (5)

• 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é

Et le reste de confoo?

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…

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

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…

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

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…

Merci!

• http://www.evernote.com/pub/saadtazi/confoo

• Questions?

Recommended