Successfully reported this slideshow.
Your SlideShare is downloading. ×

Symfony Best Practices

Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Loading in …3
×

Check these out next

1 of 75 Ad

More Related Content

Slideshows for you (20)

Similar to Symfony Best Practices (20)

Advertisement

Recently uploaded (20)

Symfony Best Practices

  1. 1. Le guide du code propre
  2. 2. Hello World ● Wanadev, créé en 2009 ● Basé à Lyon ● Prestation Symfony2 ● WebGL power
  3. 3. ● Baptiste Donaux, développeur Symfony ● Twitter @baptistedonaux ● Gmail baptiste.donaux@gmail.com Hello World
  4. 4. Best Practices Le Best Practices, qu'est-ce que c'est ? ● 31 conseils issus de la communauté ● Destiné à tous les développeurs (initiés ou non) ● Un document en perpétuelle évolution
  5. 5. Best Practices Le Best Practices, qu'est-ce que ce n'est pas ? ● Un tutoriel ● Une checklist à valider pour déployer son application
  6. 6. Best Practices Il a pour but de conseiller et de guider les développeurs, de manière à uniformiser le code.
  7. 7. Sommaire ● Créer un projet ● Configurer un projet ● Organiser votre application ● Les contrôleurs ● Les templates ● Les formulaires ● Internationalisation ● Sécurité ● Assets ● Tests
  8. 8. Partie 1 Créer un projet
  9. 9. Créer un projet ● Toujours utiliser Composer
  10. 10. Créer un projet ● Toujours utiliser Composer ● Résolution des dépendances automatiques
  11. 11. Créer un projet ● Toujours utiliser Composer ● Résolution des dépendances automatiques ● Installation automatique des assets
  12. 12. Créer un projet ● Toujours utiliser Composer ● Résolution des dépendances automatique ● Installation automatique des assets Packagist.org est la base de données de Composer
  13. 13. Créer un projet Structurer notre application app/cache/ stocke le cache de l'application app/config/ stocke les configurations app/logs/ stocke les logs app/Resources/ stocke les templates ainsi que les traductions src/AppBundle/ stocke le code métier vendor/ contient les dépendances gérées par Composer web/ contient les fichiers exposés ainsi que les assets
  14. 14. Créer un projet Un bundle doit être standalone. $ php app/console generate:bundle Création d'un unique bundle AppBundle par application logique.
  15. 15. Créer un projet Un bundle doit être standalone. $ php app/console generate:bundle On y reviendra plus tard… Création d'un unique bundle AppBundle par application logique.
  16. 16. Partie 2 Configurer un projet
  17. 17. Configurer un projet ● Définition des variables dynamiques dans parameters.yml
  18. 18. Configurer un projet ● Définition des variables dynamiques dans parameters.yml Non versionné
  19. 19. Configurer un projet ● Définition des variables dynamiques dans parameters.yml ● incenteev/composer-parameter-handler Permet de générer automatiquement le parameters.yml à partir du parameters.yml.dist Non versionné
  20. 20. Configurer un projet ● Définition des variables dynamiques dans parameters.yml ● incenteev/composer-parameter-handler Permet de générer automatiquement le parameters.yml à partir du parameters.yml.dist Non versionné Versionné
  21. 21. Configurer un projet ● Définition des variables statiques dans app/config/config.yml ● Pour les variables statiques valables pour un environnement app/config/config_{env_name}.yml Exemple : – config_dev.yml – config_prod.yml
  22. 22. Configurer un projet Comment savoir si mes variables sont dynamiques ou statiques ? Une variable est constante pour les variables qui changent peu.
  23. 23. Configurer un projet La déclaration de service se fait dans des fichiers dédiés. JAMAIS EN DUR ! Exemple : ● *Extension charge les fichiers .yml ● Les *.yml chargés, déclarent des services
  24. 24. Partie 3 Organiser votre application
  25. 25. Organiser votre application Cela ne nous empêche pas d'organiser notre code ! Création d'un unique bundle AppBundle par application logique.
  26. 26. Organiser votre application Cela ne nous empêche pas d'organiser notre code ! Création d'un unique bundle AppBundle par application logique.
  27. 27. Organiser votre application Cela ne nous empêche pas d'organiser notre code ! Création d'un unique bundle AppBundle par application logique. Recommandé Plus simple
  28. 28. Organiser votre application Cela ne nous empêche pas d'organiser notre code ! Création d'un unique bundle AppBundle par application logique. Peut être déclaré comme service
  29. 29. Organiser votre application Vous pouvez aussi faire ça ! Création d'un unique bundle AppBundle par application logique.
  30. 30. Organiser votre application Vous pouvez aussi faire ça ! Création d'un unique bundle AppBundle par application logique. Et c'est conseillé par Sensio !
  31. 31. Organiser votre application Les autres recommandations - Service ● Utilisation du format YAML XML très répandu mais plus verbeux
  32. 32. Organiser votre application Les autres recommendations - Service ● Utilisation du format YAML XML très répandu mais plus verbeux ● Ne pas définir les classes de nos services dans des variables
  33. 33. Organiser votre application Les autres recommandations – ORM ● Stocker les entités dans src/Namespace/MyBundle/Entity
  34. 34. Organiser votre application Les autres recommandations – ORM ● Stocker les entités dans src/Namespace/MyBundle/Entity ● Utiliser les annotations sur les entités Tous les formats ont la même performance, c'est donc une histoire de préférences
  35. 35. Organiser votre application Les autres recommendations – ORM ● Stocker les entités dans src/Namespace/MyBundle/Entity ● Utiliser les annotations sur les entités Tous les formats ont la même performance, c'est donc une histoire de préférences ● Utiliser des Fixtures
  36. 36. Organiser votre application Coding standards Symfony respecte le PSR-1 et le PSR-2. ● PSR-1 : Basic Coding Standard ● PSR-2 : Coding Style Guide Respecter le PSR-1 et le PSR-2 permet de facilement relire le code d'un collègue.
  37. 37. Organiser votre application Coding standards Symfony respecte le PSR-1 et le PSR-2. ● PSR-1 : Basic Coding Standard ● PSR-2 : Coding Style Guide Respecter le PSR-1 et le PSR-2 permet de facilement relire le code d'un collègue. Proposing a Standards Recommendation
  38. 38. Partie 4 Les contrôleurs
  39. 39. Les contrôleurs ● Les contrôleurs doivent être réalisés en respectant la règle « 5-10-20 »
  40. 40. Les contrôleurs ● Les contrôleurs doivent être réalisés en respectant la règle « 5-10-20 » – 5 variables maximum par méthode – 10 méthodes maximum par contrôleur – 20 lignes maximum par méthode
  41. 41. Les contrôleurs ● Les contrôleurs doivent être réalisés en respectant la règle « 5-10-20 » – 5 variables maximum par méthode – 10 méthodes maximum par contrôleur – 20 lignes maximum par méthodes Une méthode est une agrégation d'appel à du code métier.
  42. 42. Les contrôleurs ● Ils doivent hériter du contrôleur de base du FrameworkBundle (Sensio). Utilisation du container
  43. 43. Les contrôleurs ● Ils doivent hériter du contrôleur de base du FrameworkBundle (Sensio). Utilisation du container ● Utilisation des annotations recommandée YAML, XML et PHP fonctionnent de la même manière.
  44. 44. Les contrôleurs ● Template Il est déconseillé d'utiliser l'annotation @Template
  45. 45. Les contrôleurs ● Template Il est déconseillé d'utiliser l'annotation @Template ● ParamConverter Conseillé pour les cas simples
  46. 46. Les contrôleurs ● Template Il est déconseillé d'utiliser l'annotation @Template ● ParamConverter Conseillé pour les cas simples ● Routing (hors Best Pratices) Utilisation des requirements pour rendre plus spécifique les routes
  47. 47. Partie 5 Les templates
  48. 48. Les templates ● Utilisation de Twig – Utilisé par de nombreux développeurs PHP – Gestion avancée des templates comme l'héritage – Support garanti jusqu'à Symfony 3 – Communauté très active (intégration par Drupal)
  49. 49. Les templates ● Utilisation de Twig ● Stocker les templates globaux dans app/Resources/views
  50. 50. Les templates ● Utilisation de Twig ● Stocker les templates globaux dans app/Resources/views ● Utiliser des extensions Twig pour limiter le code métier dans les templates
  51. 51. Partie 6 Les forms
  52. 52. Les forms ● Définir des forms pour chaque entité Intégration complète dans Symfony
  53. 53. Les forms ● Déclaration d'un form comme service Jacques a dit : « Vous pouvez aussi enregistrer vos formulaires comme un service… »
  54. 54. Les forms ● Déclaration d'un form comme service Jacques a dit : « Vous pouvez aussi enregistrer vos formulaires comme un service… » « … Mais ce n'est pas conseillé… »
  55. 55. Les forms ● Possibilité d'ajout de bouton directement depuis le form, mais pas conseillé
  56. 56. Les forms ● Possibilité d'ajout de bouton directement depuis le form, mais pas conseillé ● Les méthodes Twig form() et form_start() ne doivent pas être utilisées
  57. 57. Partie 7 Internationalisation
  58. 58. Internationalisation ● Multiples choix de format – PHP – Qt – .po – .mo – JSON – CSV – INI – XLIFF
  59. 59. Internationalisation ● Multiples choix de format – PHP – Qt – .po – .mo – JSON – CSV – INI – XLIFF Conseillé par Sensio
  60. 60. Internationalisation ● Multiples choix de format – PHP – Qt – .po – .mo – JSON – CSV – INI – XLIFF Conseillé par Sensio On aime bien Qt et son outil
  61. 61. Internationalisation ● On stocke tous nos traductions dans app/Resources/translations ● On utilise des clés pour traduire notre contenu
  62. 62. Partie 8 Sécurité
  63. 63. Sécurité ● L'utilisation de FOSUserBundle n'est plus nécessaire ! – Kit de survie : Gestion utilisateur sans FOSUserBundle – Implémenter un UserProvider – Implémenter son propre SecurityController ● Mettre en place une unique « entrée firewall » ● Mettre en place un encodage spécifique – bcrypt (en natif à partir de PHP 5.5) ● Utiliser la clé anonymous
  64. 64. Sécurité ● Gestion des autorisations – Protéger les URL globales via le security.yml
  65. 65. Sécurité ● Gestion des autorisations – Protéger les URL globales via le security.yml – Utiliser les annotations @Security
  66. 66. Sécurité ● Gestion des autorisations – Protéger les URL globales via le security.yml – Utiliser les annotations @Security – On évite d'utiliser @Secure
  67. 67. Sécurité ● Gestion des autorisations – Protéger les URL globales via le security.yml – Utiliser les annotations @Security – On évite d'utiliser @Secure – Utiliser le service security.context pour vérifier les droits
  68. 68. Sécurité ● Gestion des autorisations – Protéger les URL globales via le security.yml – Utiliser les annotations @Security – On évite d'utiliser @Secure – Utiliser le service security.context pour vérifier les droits – Définir des voters
  69. 69. Partie 9 Assets
  70. 70. Assets ● Peu de choses à dire. Il gère les ressources (CSS, JavaScript, images). – Concaténation des ressources – Minification – Compilation des Less, Sass, TypeScript… – Compression des images
  71. 71. Assets ● Peu de choses à dire. Il gère les ressources (CSS, JavaScript, images). – Concaténation des ressources – Minification – Compilation des Less, Sass, TypeScript… – Compression des images ● Assetic géré par défaut. Possibilité d'utiliser d'autres outils tels que GruntJS.
  72. 72. Partie 10 Tests
  73. 73. Tests ● Tests unitaires Ils seront utilisés par les tests fonctionnels ● Tests fonctionnels – Créer de bons scénarios est essentiel – Tester le code retour d'une page – Privilégier l'utilisation d'URL hardcodée plutôt que générée
  74. 74. Tests ● Les outils – PHPUnit et PhpSpec pour le PHP – Mink (librairie de PHPUnit) et CasperJS pour le JavaScript – Faker et Alice pour générer des jeux de données
  75. 75. The end ! Le Best Practices changent régulièrement tout comme Symfony. Tenez-vous au courant ! Slideshare extrait de l'article de Baptiste Donaux sur les Bonnes Pratiques Symfony. Remerciement tout particulier pour leur relecture à Anthony Colas @anthonycolas, Manuel Klein @manukleins et Yannick Comte @cyannick.

×