Mieux Développer en PHP avec Symfony

7 223 vues

Publié le

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.

Publié dans : Technologie
0 commentaire
1 j’aime
Statistiques
Remarques
  • Soyez le premier à commenter

Aucun téléchargement
Vues
Nombre de vues
7 223
Sur SlideShare
0
Issues des intégrations
0
Intégrations
143
Actions
Partages
0
Téléchargements
202
Commentaires
0
J’aime
1
Intégrations 0
Aucune incorporation

Aucune remarque pour cette diapositive

Mieux Développer en PHP avec Symfony

  1. 1. Développer mieux en PHP avec HugoHamon-ForumPHPAFUP2010–Paris–10/11/2010
  2. 2. 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
  3. 3. Symfony, un framework professionnel !
  4. 4. 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
  5. 5. Ø  Documentation Open-Source Ø  API stable et fiable Ø  Communauté active Ø  Plugins Open-Source Ø  Développeurs sur le marché Ø  Formation & Consulting Un  riche  écosystème
  6. 6. Ils  utilisent  symfony
  7. 7. Résoudre les problématiques du développement web.
  8. 8. Industrialiser les développements1.
  9. 9. Industrialiser § Développer plus vite § Développer mieux § Réduire les coûts de développement § Favoriser la réutilisabilité du code § Simplifier les opérations de maintenance § Simplifier les déploiements
  10. 10. Coût  de  développement Dv T $ Dev Test
  11. 11. Coût  de  maintenance C M T D $$$ Compréhension Test Déploiement Modification
  12. 12. Coût Développement $ Coût Maintenance $$$ Compréhension Correction Test Déploiement Développement Test
  13. 13. Objectifs  ? Moins  de   Code Moins  de   complexité Moins  de   bogues Plus  de   Productivité Plus  de   temps
  14. 14. Automatiser  des  tâches  pénibles
  15. 15. Déboguer  plus  vite Web DebugToolbar
  16. 16. ² Requêtes SQL ² Logs ² Variables d’environnement ($_GET, $_POST, $_COOKIE…) ² Configuration de PHP ² Timers ² Variables de configuration de Symfony
  17. 17. Stack traces
  18. 18. Déboguer  plus  vite  (Symfony2) Profiler
  19. 19. Journalisation  des  logs ² Requêtes SQL, en-têtes envoyés, exceptions attrapées…
  20. 20. 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 Configuration des serveurs de déploiement dans un fichier INI
  21. 21. Favoriser le travail en équipe2.
  22. 22. 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  Configuration globale q  Données du projet q  Classes PHP q  Journaux de logs q  Plugins installés q  Tests automatisés q  Fichiers publics
  23. 23. Conventions  de  codage q  Nommage des fichiers q  Nommage des variables q  Philosophie de codage q  Même outillage pour tout le monde
  24. 24. Architecture  MVC
  25. 25. # 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 : CoucheVue : # 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 ?>
  26. 26. # 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) :
  27. 27. Ne pas réinventer la roue3.
  28. 28. 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
  29. 29. 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+ }
  30. 30. 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
  31. 31. 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
  32. 32. Traitement  des  formulaires § Simplifier 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
  33. 33. 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]'); } }
  34. 34. 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'); } } }
  35. 35. 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
  36. 36. 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>
  37. 37. Authentification  et  ACLs § Authentification de l’utilisateur § Gestion des droits d’accès $user->setAuthenticated(true); $user->isAuthenticated(); $user->addCredentials(array('AUTHOR', 'PUBLISHER')); $user->hasCredential('PUBLISHER');
  38. 38. Envoi  d’emails § Intégration de Swift Mailer § API orientée objet § Flexible et extensible § Support des files d’attente de mails § Entièrement configurable § Intégration avec les ORMs
  39. 39. Envoi  d’emails $mail = $this->getMailer()->compose( 'you@example.com', 'me@example.com', '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 configurable
  40. 40. Sécurité de l’application4.
  41. 41. 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();
  42. 42. 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>
  43. 43. Générer des backoffices5.
  44. 44. Admin  Generator q Génération de backoffice q Liste q Ajout q Modification q Suppression q Filtres de recherche q Pagination q Entièrement configurable q Gestion des droits d’accès q Extensible / Surchargeable
  45. 45. Admin  Generator $ php symfony doctrine:generate-admin backend Product
  46. 46. 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
  47. 47. Etendre les fonctionnalités6.
  48. 48. Ligne  de  commandes q Le framework de tâches automatisées peut accueillir de nouvelles commandes personnalisées.
  49. 49. 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()) { // ... } }
  50. 50. Plugins  communautaires q Près d’un millier de plugins Open-Source disponibles q Faciles à installer et à utiliser
  51. 51. 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
  52. 52. Garantir la qualité du code7.
  53. 53. Tests  unitaires q Symfony 1.x : Lime q Symfony 2.x : PHPUnit 3.5 q Vérifier que le code est correct q Faciliter la détection des bogues et des régressions q Documenter le code
  54. 54. Tests  unitaires
  55. 55. Tests  fonctionnels q Vérifier 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
  56. 56. 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));
  57. 57. Tests  fonctionnels
  58. 58. Performances & scalabilité8.
  59. 59. Rôle  du  cache  de  symfony q Cache de la configurationYAML 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
  60. 60. Performances  de  Symfony2 q  Bénéfices 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 flexible q Performances accrues avec un Reverse Proxy (Varnish / Squid) q Support des ESI – Edge Side Includes – RFC 2616
  61. 61. Surcharge  du  coeur q Possibilité de redéfinir la configuration de symfony q Ex : Request, Response, User, Cache, I18N, Mailer… dev: mailer: param: delivery_strategy: none transport: class: Swift_NullTransport
  62. 62. Contribuer à Symfony9.
  63. 63. 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
  64. 64. Merci ! Sensio S.A. 92-98, boulevardVictor Hugo 92 115 Clichy Cedex FRANCE Tél. : +33 1 40 99 80 80 www.sensiolabs.com - www.symfony-project.org - trainings.sensiolabs.com

×