Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Le guide du code propre
Hello World
● Wanadev, créé en 2009
● Basé à Lyon
● Prestation Symfony2
● WebGL power
● Baptiste Donaux, développeur Symfony
● Twitter @baptistedonaux
● Gmail baptiste.donaux@gmail.com
Hello World
Best Practices
Le Best Practices, qu'est-ce que c'est ?
● 31 conseils issus de la communauté
● Destiné à tous les développ...
Best Practices
Le Best Practices, qu'est-ce que ce n'est pas ?
● Un tutoriel
● Une checklist à valider pour déployer son
a...
Best Practices
Il a pour but de conseiller et de guider les
développeurs, de manière à uniformiser le code.
Sommaire
● Créer un projet
●
Configurer un projet
● Organiser votre application
●
Les contrôleurs
●
Les templates
●
Les fo...
Partie 1
Créer un projet
Créer un projet
● Toujours utiliser Composer
Créer un projet
● Toujours utiliser Composer
● Résolution des dépendances
automatiques
Créer un projet
● Toujours utiliser Composer
● Résolution des dépendances
automatiques
● Installation automatique des asse...
Créer un projet
● Toujours utiliser Composer
● Résolution des dépendances
automatique
● Installation automatique des asset...
Créer un projet
Structurer notre application
app/cache/ stocke le cache de
l'application
app/config/ stocke les configurat...
Créer un projet
Un bundle doit être standalone.
$ php app/console generate:bundle
Création d'un unique bundle AppBundle pa...
Créer un projet
Un bundle doit être standalone.
$ php app/console generate:bundle
On y reviendra plus tard…
Création d'un ...
Partie 2
Configurer un projet
Configurer un projet
● Définition des variables dynamiques dans
parameters.yml
Configurer un projet
● Définition des variables dynamiques dans
parameters.yml
Non versionné
Configurer un projet
● Définition des variables dynamiques dans
parameters.yml
● incenteev/composer-parameter-handler
Perm...
Configurer un projet
● Définition des variables dynamiques dans
parameters.yml
● incenteev/composer-parameter-handler
Perm...
Configurer un projet
● Définition des variables statiques dans
app/config/config.yml
● Pour les variables statiques valabl...
Configurer un projet
Comment savoir si mes variables sont
dynamiques ou statiques ?
Une variable est constante pour les va...
Configurer un projet
La déclaration de service se fait dans des fichiers
dédiés. JAMAIS EN DUR !
Exemple :
● *Extension ch...
Partie 3
Organiser votre application
Organiser votre application
Cela ne nous empêche pas d'organiser notre
code !
Création d'un unique bundle AppBundle par ap...
Organiser votre application
Cela ne nous empêche pas d'organiser notre
code !
Création d'un unique bundle AppBundle par ap...
Organiser votre application
Cela ne nous empêche pas d'organiser notre
code !
Création d'un unique bundle AppBundle par ap...
Organiser votre application
Cela ne nous empêche pas d'organiser notre
code !
Création d'un unique bundle AppBundle par ap...
Organiser votre application
Vous pouvez aussi faire ça !
Création d'un unique bundle AppBundle par application logique.
Organiser votre application
Vous pouvez aussi faire ça !
Création d'un unique bundle AppBundle par application logique.
Et...
Organiser votre application
Les autres recommandations - Service
● Utilisation du format YAML
XML très répandu mais plus v...
Organiser votre application
Les autres recommendations - Service
● Utilisation du format YAML
XML très répandu mais plus v...
Organiser votre application
Les autres recommandations – ORM
● Stocker les entités dans
src/Namespace/MyBundle/Entity
Organiser votre application
Les autres recommandations – ORM
● Stocker les entités dans
src/Namespace/MyBundle/Entity
● Ut...
Organiser votre application
Les autres recommendations – ORM
● Stocker les entités dans
src/Namespace/MyBundle/Entity
● Ut...
Organiser votre application
Coding standards
Symfony respecte le PSR-1 et le PSR-2.
● PSR-1 : Basic Coding Standard
● PSR-...
Organiser votre application
Coding standards
Symfony respecte le PSR-1 et le PSR-2.
● PSR-1 : Basic Coding Standard
● PSR-...
Partie 4
Les contrôleurs
Les contrôleurs
● Les contrôleurs doivent être réalisés en respectant la
règle « 5-10-20 »
Les contrôleurs
● Les contrôleurs doivent être réalisés en respectant la
règle « 5-10-20 »
– 5 variables maximum par métho...
Les contrôleurs
● Les contrôleurs doivent être réalisés en respectant la
règle « 5-10-20 »
– 5 variables maximum par métho...
Les contrôleurs
● Ils doivent hériter du contrôleur de base du
FrameworkBundle (Sensio).
Utilisation du container
Les contrôleurs
● Ils doivent hériter du contrôleur de base du
FrameworkBundle (Sensio).
Utilisation du container
● Utilis...
Les contrôleurs
● Template
Il est déconseillé d'utiliser l'annotation @Template
Les contrôleurs
● Template
Il est déconseillé d'utiliser l'annotation @Template
● ParamConverter
Conseillé pour les cas si...
Les contrôleurs
● Template
Il est déconseillé d'utiliser l'annotation @Template
● ParamConverter
Conseillé pour les cas si...
Partie 5
Les templates
Les templates
● Utilisation de Twig
– Utilisé par de nombreux développeurs PHP
– Gestion avancée des templates comme l'hér...
Les templates
● Utilisation de Twig
● Stocker les templates globaux dans
app/Resources/views
Les templates
● Utilisation de Twig
● Stocker les templates globaux dans
app/Resources/views
● Utiliser des extensions Twi...
Partie 6
Les forms
Les forms
● Définir des forms pour chaque entité
Intégration complète dans Symfony
Les forms
● Déclaration d'un form comme service
Jacques a dit : « Vous pouvez aussi enregistrer
vos formulaires comme un s...
Les forms
● Déclaration d'un form comme service
Jacques a dit : « Vous pouvez aussi enregistrer
vos formulaires comme un s...
Les forms
● Possibilité d'ajout de bouton directement depuis
le form, mais pas conseillé
Les forms
● Possibilité d'ajout de bouton directement depuis
le form, mais pas conseillé
● Les méthodes Twig form() et for...
Partie 7
Internationalisation
Internationalisation
● Multiples choix de format
– PHP
– Qt
– .po
– .mo
– JSON
– CSV
– INI
– XLIFF
Internationalisation
● Multiples choix de format
– PHP
– Qt
– .po
– .mo
– JSON
– CSV
– INI
– XLIFF
Conseillé par
Sensio
Internationalisation
● Multiples choix de format
– PHP
– Qt
– .po
– .mo
– JSON
– CSV
– INI
– XLIFF
Conseillé par
Sensio
On...
Internationalisation
● On stocke tous nos traductions dans
app/Resources/translations
● On utilise des clés pour traduire ...
Partie 8
Sécurité
Sécurité
● L'utilisation de FOSUserBundle n'est plus nécessaire !
– Kit de survie : Gestion utilisateur sans FOSUserBundle...
Sécurité
● Gestion des autorisations
– Protéger les URL globales via le security.yml
Sécurité
● Gestion des autorisations
– Protéger les URL globales via le security.yml
– Utiliser les annotations @Security
Sécurité
● Gestion des autorisations
– Protéger les URL globales via le security.yml
– Utiliser les annotations @Security
...
Sécurité
● Gestion des autorisations
– Protéger les URL globales via le security.yml
– Utiliser les annotations @Security
...
Sécurité
● Gestion des autorisations
– Protéger les URL globales via le security.yml
– Utiliser les annotations @Security
...
Partie 9
Assets
Assets
● Peu de choses à dire. Il gère les ressources
(CSS, JavaScript, images).
– Concaténation des ressources
– Minifica...
Assets
● Peu de choses à dire. Il gère les ressources
(CSS, JavaScript, images).
– Concaténation des ressources
– Minifica...
Partie 10
Tests
Tests
● Tests unitaires
Ils seront utilisés par les tests fonctionnels
● Tests fonctionnels
– Créer de bons scénarios est ...
Tests
● Les outils
– PHPUnit et PhpSpec pour le PHP
– Mink (librairie de PHPUnit) et CasperJS pour le
JavaScript
– Faker e...
The end !
Le Best Practices changent régulièrement tout comme
Symfony. Tenez-vous au courant !
Slideshare extrait de l'art...
Upcoming SlideShare
Loading in …5
×

Symfony Best Practices

6,498 views

Published on

Symfony Best Practices présenté par Wanadev (en français), par Baptiste Donaux.

Published in: Technology

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.

×