Ce diaporama a bien été signalé.
Nous utilisons votre profil LinkedIn et vos données d’activité pour vous proposer des publicités personnalisées et pertinentes. Vous pouvez changer vos préférences de publicités à tout moment.
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...
Prochain SlideShare
Chargement dans…5
×

Symfony Best Practices

5 852 vues

Publié le

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

Publié dans : Technologie

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.

×