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. Best Practices
Le Best Practices, qu'est-ce que ce n'est pas ?
● Un tutoriel
● Une checklist à valider pour déployer son
application
6. Best Practices
Il a pour but de conseiller et de guider les
développeurs, de manière à uniformiser le code.
7. Sommaire
● Créer un projet
●
Configurer un projet
● Organiser votre application
●
Les contrôleurs
●
Les templates
●
Les formulaires
●
Internationalisation
●
Sécurité
●
Assets
● Tests
10. Créer un projet
● Toujours utiliser Composer
● Résolution des dépendances
automatiques
11. Créer un projet
● Toujours utiliser Composer
● Résolution des dépendances
automatiques
● Installation automatique des assets
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. 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. 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. 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.
18. Configurer un projet
● Définition des variables dynamiques dans
parameters.yml
Non versionné
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. 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. 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. Configurer un projet
Comment savoir si mes variables sont
dynamiques ou statiques ?
Une variable est constante pour les variables qui
changent peu.
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
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. Organiser votre application
Cela ne nous empêche pas d'organiser notre
code !
Création d'un unique bundle AppBundle par application logique.
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. 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
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. Organiser votre application
Les autres recommandations - Service
● Utilisation du format YAML
XML très répandu mais plus verbeux
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
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. 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. 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. 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
39. Les contrôleurs
● Les contrôleurs doivent être réalisés en respectant la
règle « 5-10-20 »
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. 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. Les contrôleurs
● Ils doivent hériter du contrôleur de base du
FrameworkBundle (Sensio).
Utilisation du container
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.
45. Les contrôleurs
● Template
Il est déconseillé d'utiliser l'annotation @Template
● ParamConverter
Conseillé pour les cas simples
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
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)
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
52. Les forms
● Définir des forms pour chaque entité
Intégration complète dans Symfony
53. Les forms
● Déclaration d'un form comme service
Jacques a dit : « Vous pouvez aussi enregistrer
vos formulaires comme un service… »
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é… »
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
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
65. Sécurité
● Gestion des autorisations
– Protéger les URL globales via le security.yml
– Utiliser les annotations @Security
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. 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. 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
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. 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.
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. 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. 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.