Transcript
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


Recommended