64
Développer mieux en PHP avec Hugo Hamon - Forum PHP AFUP 2010 – Paris – 10/11/2010

Mieux Développer en PHP avec Symfony

Embed Size (px)

DESCRIPTION

Au cours de cette session, nous présenterons d'une manière générale toutes les caractéristiques qui font de symfony un framework open source tourné vers le monde professionnel.Il s'agira dans un premier temps de montrer que symfony n'est pas seulement une base de code mais un projet open source à part entière disposant d'un écosystème riche sur lequel n'importe quel développeur peut compter.Nous porterons ensuite un oeil plus attentif aux fonctionnalités phares du framework telles que sa couche d'abstraction de base de données, son interface en ligne de commande, le routing bidirectionnel, les outils de test automatisés ou bien encore le générateur automatique de backoffice.

Citation preview

Page 1: Mieux Développer en PHP avec Symfony

Développer mieux en PHP avec

Hugo Hamon - Forum PHP AFUP 2010 – Paris – 10/11/2010

Page 2: Mieux Développer en PHP avec Symfony

Qui  suis-­‐‑je  ? v  Hugo HAMON (@hhamon)

v  Responsable des formations à v  Premiers pas avec PHP en 2002

v  Secrétaire de l’AFUP

v  Auteur du site Apprendre-PHP.com

v  Coauteur & contributeur à des ouvrages Eyrolles

Page 3: Mieux Développer en PHP avec Symfony

Symfony, un framework professionnel !

Page 4: Mieux Développer en PHP avec Symfony

Le projet symfony… symfony 1.0 symfony 1.1 symfony 1.4 Symfony 2.0

License MIT

Version actuelle 1.0.22 1.1.9 1.4.8 2.0.0 - PR

Date de sortie Octobre 2005 Juin 2008 Novembre 2009 Mars 2011

Support Terminé Terminé Fin 2012 ?

Stabilité Stable Stable Stable Presque stable

Production Oui Oui Oui Bientôt

Documentation Oui Oui Oui En cours

Page 5: Mieux Développer en PHP avec Symfony

Ø  Documentation Open-Source

Ø  API stable et !able

Ø  Communauté active

Ø  Plugins Open-Source

Ø  Développeurs sur le marché

Ø  Formation & Consulting

Un  riche  écosystème

Page 6: Mieux Développer en PHP avec Symfony

Ils  utilisent  symfony

Page 7: Mieux Développer en PHP avec Symfony

Résoudre les problématiques du

développement web.

Page 8: Mieux Développer en PHP avec Symfony

Industrialiser les développements 1.

Page 9: Mieux Développer en PHP avec Symfony

Industrialiser

§ Développer plus vite

§ Développer mieux

§ Réduire les coûts de développement

§ Favoriser la réutilisabilité du code

§ Simpli!er les opérations de maintenance

§ Simpli!er les déploiements

Page 10: Mieux Développer en PHP avec Symfony

Coût  de  développement

Dv

T

$

Dev

Test

Page 11: Mieux Développer en PHP avec Symfony

Coût  de  maintenance

C

M

T

D

$$$

Compréhension

Test

Déploiement

Modi!cation

Page 12: Mieux Développer en PHP avec Symfony

Coût Développement

$

Coût Maintenance

$$$

Compréhension

Correction

Test

Déploiement

Développement

Test

Page 13: Mieux Développer en PHP avec Symfony

Objectifs  ? Moins  de  Code

Moins  de  complexité

Moins  de  bogues

Plus  de  Productivité

Plus  de  temps

Page 14: Mieux Développer en PHP avec Symfony

Automatiser  des  tâches  pénibles

Page 15: Mieux Développer en PHP avec Symfony

Déboguer  plus  vite

Web Debug Toolbar

Page 16: Mieux Développer en PHP avec Symfony

² Requêtes SQL ² Logs ² Variables d’environnement ($_GET, $_POST, $_COOKIE…) ² Con!guration de PHP ² Timers ² Variables de con!guration de Symfony

Page 17: Mieux Développer en PHP avec Symfony

Stack traces

Page 18: Mieux Développer en PHP avec Symfony

Déboguer  plus  vite  (Symfony2)

Pro!ler

Page 19: Mieux Développer en PHP avec Symfony

Journalisation  des  logs

² Requêtes SQL, en-têtes envoyés, exceptions attrapées…

Page 20: Mieux Développer en PHP avec Symfony

Simplifier  les  déploiements

$ php symfony project:deploy production --go

[production] host=123.456.7.8 user=hhamon port=22 path=/var/www/www.monsite.com

Déploiement automatisé avec une connexion SSH + RSYNC

Con!guration des serveurs de déploiement dans un !chier INI

Page 21: Mieux Développer en PHP avec Symfony

Favoriser le travail en équipe 2.

Page 22: Mieux Développer en PHP avec Symfony

Arborescence  connue

$ tree -L 1 -F . |-- apps/ |-- cache/ |-- config/ |-- data/ |-- lib/ |-- log/ |-- plugins/ |-- symfony* |-- test/ `-- web/ 9 directories, 1 file

q  Applications q  Cache q  Con!guration globale q  Données du projet q  Classes PHP q  Journaux de logs q  Plugins installés q  Tests automatisés q  Fichiers publics

Page 23: Mieux Développer en PHP avec Symfony

Conventions  de  codage

q  Nommage des !chiers

q  Nommage des variables

q  Philosophie de codage

q  Même outillage pour tout le monde

Page 24: Mieux Développer en PHP avec Symfony

Architecture  MVC

Page 25: Mieux Développer en PHP avec Symfony

# apps/frontend/modules/post/actions/actions.class.php class postActions extends sfActions { public function executeIndex(sfWebRequest $request) { $this->posts = PostTable::getInstance()->getMostRecents(10); } }

Couche Contrôleur :

Couche Vue : # apps/frontend/modules/post/templates/indexSuccess.php<?php foreach ($posts as $post) : ?><h2><?php echo $post->getTitle() ?></h2><div class="content"> <?php echo simple_format_text($post->getContent()) ?></div><?php endforeach ?>

Page 26: Mieux Développer en PHP avec Symfony

# lib/model/doctrine/PostTable.class.php class PostTable extends Doctrine_Table { public function getMostRecents($limit) { return $this-> createQuery('a')-> where('a.is_published = ?', true)-> orderBy('a.published_at desc')-> limit($limit)-> execute(); } }

Couche Modèle (Doctrine ORM) :

Page 27: Mieux Développer en PHP avec Symfony

Ne pas réinventer la roue 3.

Page 28: Mieux Développer en PHP avec Symfony

Configuration  des  URLs

q  Optimisation pour les SEO q  Faciles à bookmarker, mémoriser ou échanger q  Masquent l’implémentation technique

http://www.domain.tld/blog.php?action=show&id=12546

http://www.domain.tld/blog/2010/11/10/forum-php-afup

URL PHP

URL Symfony

Page 29: Mieux Développer en PHP avec Symfony

Configuration  YAML  des  URLs

signin: url: /:sf_culture/login param: { module: authentication, action: login } requirements: { sf_culture: (?:en|fr) } signout: url: /:sf_culture/logout param: { module: authentication, action: logout } requirements: { sf_culture: (?:en|fr) } my_account: url: /:sf_culture/account param: { module: home, action: showAccount } requirements: { sf_culture: (?:en|fr) } products: url: /:sf_culture/shop/:page param: { module: product, action: index, page: 1 } requirements: { sf_culture: (?:en|fr), page: \d+ }

Page 30: Mieux Développer en PHP avec Symfony

Accès  aux  bases  de  données §  Projets matures §  Pilotés par F. Zaninotto & J. Wage

§  Abstraction de BDD & ORM

§  PDO pour couche basse §  Nombreuses BDD supportées §  Génération de code et behaviors §  API abstraite et OO de requêtes SQL § Migrations

Page 31: Mieux Développer en PHP avec Symfony

ORM  /  Active  Record

$speaker = new Speaker(); $speaker->setFirstName('Hugo'); $speaker->setLastName('Hamon'); $conference = new Conference(); $conference->setSpeaker($speaker); $conference->setTitle('Introduction à symfony'); $conference->setSchedule('2010-11-10 09:00:00'); $conference->save();

Sauvegarde des deux enregistrements en BDD

Page 32: Mieux Développer en PHP avec Symfony

Traitement  des  formulaires

§ Simpli!er la création et la validation des formulaires

§ API entièrement orientée objet

§ Flexible et extensible

§ Intégration avec les ORMs

§ Nombreux validateurs et « widgets » livrés

§ Simplicité d’utilisation pour les intégrateurs web

Page 33: Mieux Développer en PHP avec Symfony

class ContactForm extends sfForm { public function configure() { $this->setWidgets(array( 'email' => new sfWidgetFormInputText(), 'message' => new sfWidgetFormTextarea() )); $this->setValidators(array( 'email' => new sfValidatorEmail(), 'message' => new sfValidatorString() )); $this->widgetSchema->setNameFormat('contact[%s]'); } }

Page 34: Mieux Développer en PHP avec Symfony

class contactActions extends sfActions{ public function executeProcessForm(sfWebRequest $request) { $this->forward404Unless($request->getMethod('post')); $this->form = new ContactForm(); $this->form->bind($request->getParameter('contact')); if ($this->form->isValid()) { $values = $this->form->getValues(); // ... do something $this->redirect('contact/thankYou'); } }}

Page 35: Mieux Développer en PHP avec Symfony

I18N  &  L10N

§ Sites multilingues

§ Formatage de dates, monnaies, nombres…

§ Gestion des pluriels

§ Localisation des chaînes de l’interface

§ Support des tables I18N par les ORMs

§ Gestion automatique de la culture de l’utilisateur

Page 36: Mieux Développer en PHP avec Symfony

I18N  &  L10N <p> <?php echo __('Hello, my name is %name%', array( '%name%' => 'Hugo’ )) ?>. </p> <p> It costs <?php echo format_currency(125990, 'EUR') ?>. </p> <p> There are <?php echo format_number(1350) ?> people here. </p>

Page 37: Mieux Développer en PHP avec Symfony

Authentification  et  ACLs

§ Authenti!cation de l’utilisateur

§ Gestion des droits d’accès

$user->setAuthenticated(true); $user->isAuthenticated();

$user->addCredentials(array('AUTHOR', 'PUBLISHER')); $user->hasCredential('PUBLISHER');

Page 38: Mieux Développer en PHP avec Symfony

Envoi  d’emails

§ Intégration de Swift Mailer

§ API orientée objet

§ Flexible et extensible

§ Support des !les d’attente de mails

§ Entièrement con!gurable

§ Intégration avec les ORMs

Page 39: Mieux Développer en PHP avec Symfony

Envoi  d’emails $mail = $this->getMailer()->compose( '[email protected]', '[email protected]', 'Hell You!', "Hey guy, what's up ?");$mail->setPriority(3);$mail->attach(Swift_Attachment::fromPath('file.pdf'));$this->getMailer()->send($mail);

Le mailer est entièrement con!gurable

Page 40: Mieux Développer en PHP avec Symfony

Sécurité de l’application 4.

Page 41: Mieux Développer en PHP avec Symfony

Sécurité

q  Echappement automatique des variables de vue

q  Sécurisation des formulaires avec des jetons uniques

q  Requêtes préparées par les ORMs

$speaker = Doctrine_Query::create()-> from('Speaker s')-> where('s.last_name LIKE ?', '%Hamon%')-> fetchOne();

Page 42: Mieux Développer en PHP avec Symfony

Configuration  d’Apache

q  Accès au répertoire web/ depuis un navigateur <VirtualHost *:80> ServerName www.my-domain.com DocumentRoot "/path/to/SymfonyProject/web" <Directory "/path/to/SymfonyProject/web"> AllowOverride All Allow from All </Directory> Alias /sf /path/to/SymfonyProject/lib/vendor/symfony/data/web/sf <Directory "/path/to/SymfonyProject/lib/vendor/symfony/data/web/sf"> AllowOverride All Allow from All </Directory> </VirtualHost>

Page 43: Mieux Développer en PHP avec Symfony

Générer des backoffices 5.

Page 44: Mieux Développer en PHP avec Symfony

Admin  Generator

q  Génération de backoffice

q  Liste

q  Ajout

q  Modi!cation

q  Suppression

q  Filtres de recherche

q  Pagination

q  Entièrement con!gurable

q  Gestion des droits d’accès

q  Extensible / Surchargeable

Page 45: Mieux Développer en PHP avec Symfony

Admin  Generator $ php symfony doctrine:generate-admin backend Product

Page 46: Mieux Développer en PHP avec Symfony

generator: class: sfDoctrineGenerator param: # ... config: actions: _edit: { credentials: [ADMIN_PRODUCTS] } fields: name: { label: Nom du produit } reference: { label: Référence } price: { label: Prix } is_published: { label: Publication ? } categories_list: { label: Catégories } list: batch_actions: unlinkCategories: credentials: [[ADMIN_PRODUCTS, EDIT_PRODUCT]] label: Rendre orphelins _delete: credentials: [ADMIN_PRODUCTS]

Configuration  en  YAML

Page 47: Mieux Développer en PHP avec Symfony

Etendre les fonctionnalités 6.

Page 48: Mieux Développer en PHP avec Symfony

Ligne  de  commandes

q  Le framework de tâches automatisées peut accueillir de

nouvelles commandes personnalisées.

Page 49: Mieux Développer en PHP avec Symfony

Ligne  de  commandes class sfGuardAddPermissionTask extends sfBaseTask{ protected function configure() { // ... $this->namespace = 'guard'; $this->name = 'add-permission'; $this->briefDescription = 'Adds a new permission'; } protected function execute($arguments = array(), $options = array()) { // ... }}

Page 50: Mieux Développer en PHP avec Symfony

Plugins  communautaires

q  Près d’un millier de plugins Open-Source disponibles

q  Faciles à installer et à utiliser

Page 51: Mieux Développer en PHP avec Symfony

Composants  de  Zend  Framework

q  Intégration des composants du Zend Framework

q  Outils éprouvés et testés

q  Interopérabilité entre les deux projets

q  Zend_Soap, Zend_Lucene, Zend_Service_Twitter…

q  Obtenez que le meilleur des deux mondes J

Page 52: Mieux Développer en PHP avec Symfony

Garantir la qualité du code 7.

Page 53: Mieux Développer en PHP avec Symfony

Tests  unitaires

q  Symfony 1.x : Lime

q  Symfony 2.x : PHPUnit 3.5

q  Véri!er que le code est correct

q  Faciliter la détection des bogues et des régressions

q  Documenter le code

Page 54: Mieux Développer en PHP avec Symfony

Tests  unitaires

Page 55: Mieux Développer en PHP avec Symfony

Tests  fonctionnels

q  Véri!er les fonctionnalités de l’application

q  Simuler un scénario de navigation sur le site

q  Tester toutes les couches (request, response, user…)

q  API qui simule un véritable navigateur web

q  Syntaxe verbeuse et intuitive

Page 56: Mieux Développer en PHP avec Symfony

Tests  fonctionnels include(dirname(__FILE__).'/../../bootstrap/functional.php');$browser = new sfTestFunctional(new sfBrowser());$browser-> get('/en/contact')-> with('response')->isStatusCode(200)-> click('send', array( 'contact' => array( 'name' => '', 'email' => 'foo', 'message' => 'Lorem ipsum...' ) ), array('_with_csrf' => true));

Page 57: Mieux Développer en PHP avec Symfony

Tests  fonctionnels

Page 58: Mieux Développer en PHP avec Symfony

Performances & scalabilité 8.

Page 59: Mieux Développer en PHP avec Symfony

Rôle  du  cache  de  symfony

q  Cache de la con!guration YAML

q  Cache des dictionnaires de traduction XLIFF

q  Cache des pages HTML

q  Cache des requêtes SQL (Doctrine)

q  => Répondre plus vite à une requête HTTP

Page 60: Mieux Développer en PHP avec Symfony

Performances  de  Symfony2 q  Béné!ces des optimisations apportées à PHP 5.3

q  Conteneur d’Injection de Dépendances

q  Chargement à la demande des objets

q  Limitation de l’occupation mémoire

q  Cache HTTP performant et très "exible

q  Performances accrues avec un Reverse Proxy (Varnish / Squid)

q  Support des ESI – Edge Side Includes – RFC 2616

Page 61: Mieux Développer en PHP avec Symfony

Surcharge  du  coeur

q  Possibilité de redé!nir la con!guration de symfony

q  Ex : Request, Response, User, Cache, I18N, Mailer…

dev: mailer: param: delivery_strategy: none transport: class: Swift_NullTransport

Page 62: Mieux Développer en PHP avec Symfony

Contribuer à Symfony 9.

Page 63: Mieux Développer en PHP avec Symfony

Contribuer  au  projet

q  Documentation (blog, traductions…)

q  Canaux de discussion (IRC, forums, mailing lists, twitter)

q  Code source (patches, bogues)

q  Plugins

q  Conférences

q  Bouche à oreille

Page 64: Mieux Développer en PHP avec Symfony

Merci !

Sensio S.A. 92-98, boulevard Victor Hugo

92 115 Clichy Cedex FRANCE

Tél. : +33 1 40 99 80 80

www.sensiolabs.com - www.symfony-project.org - trainings.sensiolabs.com