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éveloppeurs (initiés ou non)
● Un document en perpétuelle évolution
Best Practices
Le Best Practices, qu'est-ce que ce n'est pas ?
● Un tutoriel
● Une checklist à valider pour déployer son
application
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 formulaires
●
Internationalisation
●
Sécurité
●
Assets
● Tests
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 assets
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
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
Créer un projet
Un bundle doit être standalone.
$ php app/console generate:bundle
Création d'un unique bundle AppBundle par application logique.
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.
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
Permet de générer automatiquement le
parameters.yml à partir du
parameters.yml.dist
Non versionné
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é
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
Configurer un projet
Comment savoir si mes variables sont
dynamiques ou statiques ?
Une variable est constante pour les variables qui
changent peu.
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
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 application logique.
Organiser votre application
Cela ne nous empêche pas d'organiser notre
code !
Création d'un unique bundle AppBundle par application logique.
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
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
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 c'est conseillé
par Sensio !
Organiser votre application
Les autres recommandations - Service
● Utilisation du format YAML
XML très répandu mais plus verbeux
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
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
● Utiliser les annotations sur les entités
Tous les formats ont la même performance,
c'est donc une histoire de préférences
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
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.
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
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éthode
– 10 méthodes maximum par contrôleur
– 20 lignes maximum par méthode
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.
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
● Utilisation des annotations recommandée
YAML, XML et PHP fonctionnent de la même
manière.
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 simples
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
Partie 5
Les templates
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)
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 Twig pour limiter le code
métier dans les templates
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 service… »
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é… »
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 form_start() ne
doivent pas être utilisées
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 aime bien Qt
et son outil
Internationalisation
● On stocke tous nos traductions dans
app/Resources/translations
● On utilise des clés pour traduire notre contenu
Partie 8
Sécurité
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
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
– On évite d'utiliser @Secure
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
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
Partie 9
Assets
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
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.
Partie 10
Tests
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
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
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.

Symfony Best Practices

  • 1.
    Le guide ducode propre
  • 2.
    Hello World ● Wanadev,créé en 2009 ● Basé à Lyon ● Prestation Symfony2 ● WebGL power
  • 3.
    ● Baptiste Donaux,développeur Symfony ● Twitter @baptistedonaux ● Gmail baptiste.donaux@gmail.com Hello World
  • 4.
    Best Practices Le BestPractices, 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 BestPractices, qu'est-ce que ce n'est pas ? ● Un tutoriel ● Une checklist à valider pour déployer son application
  • 6.
    Best Practices Il apour but de conseiller et de guider les développeurs, de manière à uniformiser le code.
  • 7.
    Sommaire ● Créer unprojet ● Configurer un projet ● Organiser votre application ● Les contrôleurs ● Les templates ● Les formulaires ● Internationalisation ● Sécurité ● Assets ● Tests
  • 8.
  • 9.
    Créer un projet ●Toujours utiliser Composer
  • 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 Structurernotre 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 Unbundle doit être standalone. $ php app/console generate:bundle Création d'un unique bundle AppBundle par application logique.
  • 15.
    Créer un projet Unbundle doit être standalone. $ php app/console generate:bundle On y reviendra plus tard… Création d'un unique bundle AppBundle par application logique.
  • 16.
  • 17.
    Configurer un projet ●Définition des variables dynamiques dans parameters.yml
  • 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 Commentsavoir si mes variables sont dynamiques ou statiques ? Une variable est constante pour les variables qui changent peu.
  • 23.
    Configurer un projet Ladé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.
  • 25.
    Organiser votre application Celane nous empêche pas d'organiser notre code ! Création d'un unique bundle AppBundle par application logique.
  • 26.
    Organiser votre application Celane nous empêche pas d'organiser notre code ! Création d'un unique bundle AppBundle par application logique.
  • 27.
    Organiser votre application Celane 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 Celane 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.
    Organiser votre application Vouspouvez aussi faire ça ! Création d'un unique bundle AppBundle par application logique.
  • 30.
    Organiser votre application Vouspouvez aussi faire ça ! Création d'un unique bundle AppBundle par application logique. Et c'est conseillé par Sensio !
  • 31.
    Organiser votre application Lesautres recommandations - Service ● Utilisation du format YAML XML très répandu mais plus verbeux
  • 32.
    Organiser votre application Lesautres 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.
    Organiser votre application Lesautres recommandations – ORM ● Stocker les entités dans src/Namespace/MyBundle/Entity
  • 34.
    Organiser votre application Lesautres 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 Lesautres 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 Codingstandards 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 Codingstandards 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.
  • 39.
    Les contrôleurs ● Lescontrôleurs doivent être réalisés en respectant la règle « 5-10-20 »
  • 40.
    Les contrôleurs ● Lescontrô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 ● Lescontrô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 ● Ilsdoivent hériter du contrôleur de base du FrameworkBundle (Sensio). Utilisation du container
  • 43.
    Les contrôleurs ● Ilsdoivent 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.
    Les contrôleurs ● Template Ilest déconseillé d'utiliser l'annotation @Template
  • 45.
    Les contrôleurs ● Template Ilest déconseillé d'utiliser l'annotation @Template ● ParamConverter Conseillé pour les cas simples
  • 46.
    Les contrôleurs ● Template Ilest 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.
  • 48.
    Les templates ● Utilisationde 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.
    Les templates ● Utilisationde Twig ● Stocker les templates globaux dans app/Resources/views
  • 50.
    Les templates ● Utilisationde Twig ● Stocker les templates globaux dans app/Resources/views ● Utiliser des extensions Twig pour limiter le code métier dans les templates
  • 51.
  • 52.
    Les forms ● Définirdes forms pour chaque entité Intégration complète dans Symfony
  • 53.
    Les forms ● Déclarationd'un form comme service Jacques a dit : « Vous pouvez aussi enregistrer vos formulaires comme un service… »
  • 54.
    Les forms ● Déclarationd'un form comme service Jacques a dit : « Vous pouvez aussi enregistrer vos formulaires comme un service… » « … Mais ce n'est pas conseillé… »
  • 55.
    Les forms ● Possibilitéd'ajout de bouton directement depuis le form, mais 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
  • 57.
  • 58.
    Internationalisation ● Multiples choixde format – PHP – Qt – .po – .mo – JSON – CSV – INI – XLIFF
  • 59.
    Internationalisation ● Multiples choixde format – PHP – Qt – .po – .mo – JSON – CSV – INI – XLIFF Conseillé par Sensio
  • 60.
    Internationalisation ● Multiples choixde format – PHP – Qt – .po – .mo – JSON – CSV – INI – XLIFF Conseillé par Sensio On aime bien Qt et son outil
  • 61.
    Internationalisation ● On stocketous nos traductions dans app/Resources/translations ● On utilise des clés pour traduire notre contenu
  • 62.
  • 63.
    Sécurité ● L'utilisation deFOSUserBundle 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.
    Sécurité ● Gestion desautorisations – Protéger les URL globales via le security.yml
  • 65.
    Sécurité ● Gestion desautorisations – Protéger les URL globales via le security.yml – Utiliser les annotations @Security
  • 66.
    Sécurité ● Gestion desautorisations – Protéger les URL globales via le security.yml – Utiliser les annotations @Security – On évite d'utiliser @Secure
  • 67.
    Sécurité ● Gestion desautorisations – 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 desautorisations – 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.
  • 70.
    Assets ● Peu dechoses à 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 dechoses à 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.
  • 73.
    Tests ● Tests unitaires Ilsseront 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 ! LeBest 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.