SlideShare une entreprise Scribd logo
1  sur  75
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.

Contenu connexe

Tendances

Atelier Symfony2- Introduction
Atelier Symfony2- IntroductionAtelier Symfony2- Introduction
Atelier Symfony2- IntroductionMarwa OUNALLI
 
Présentation symfony epita
Présentation symfony epitaPrésentation symfony epita
Présentation symfony epitaNoel GUILBERT
 
Presentation Symfony2
Presentation Symfony2Presentation Symfony2
Presentation Symfony2Ahmed ABATAL
 
Orchestrez vos projets Symfony sans fausses notes
Orchestrez vos projets Symfony sans fausses notesOrchestrez vos projets Symfony sans fausses notes
Orchestrez vos projets Symfony sans fausses notesXavier Gorse
 
Symfony 2 : chapitre 2 - Les vues en Twig
Symfony 2 : chapitre 2 - Les vues en TwigSymfony 2 : chapitre 2 - Les vues en Twig
Symfony 2 : chapitre 2 - Les vues en TwigAbdelkader Rhouati
 
Symfony2: 30 astuces et bonnes pratiques
Symfony2: 30 astuces et bonnes pratiquesSymfony2: 30 astuces et bonnes pratiques
Symfony2: 30 astuces et bonnes pratiquesNoel GUILBERT
 
Introduction à Symfony2
Introduction à Symfony2Introduction à Symfony2
Introduction à Symfony2Hugo Hamon
 
Présentation de symfony - Human talks aux docks le 8 juillet 2014
Présentation de symfony - Human talks aux docks le 8 juillet 2014Présentation de symfony - Human talks aux docks le 8 juillet 2014
Présentation de symfony - Human talks aux docks le 8 juillet 2014Tony Galmiche
 
Django pour les développeurs Symfony (et réciproquement)
Django pour les développeurs Symfony (et réciproquement)Django pour les développeurs Symfony (et réciproquement)
Django pour les développeurs Symfony (et réciproquement)Nicolas Perriault
 
wallabag, comment on a migré vers symfony3
wallabag, comment on a migré vers symfony3wallabag, comment on a migré vers symfony3
wallabag, comment on a migré vers symfony3Nicolas Lœuillet
 
Exposer des services web SOAP et REST avec symfony 1.4 et Zend Framework
Exposer des services web SOAP et REST avec symfony 1.4 et Zend FrameworkExposer des services web SOAP et REST avec symfony 1.4 et Zend Framework
Exposer des services web SOAP et REST avec symfony 1.4 et Zend FrameworkHugo Hamon
 
Symfony 2 : chapitre 4 - Les services et les formulaires
Symfony 2 : chapitre 4 - Les services et les formulairesSymfony 2 : chapitre 4 - Les services et les formulaires
Symfony 2 : chapitre 4 - Les services et les formulairesAbdelkader Rhouati
 
Formation Symfony2 par KNP Labs
Formation Symfony2 par KNP LabsFormation Symfony2 par KNP Labs
Formation Symfony2 par KNP LabsKNP Labs
 
Soutenance Zend Framework vs Symfony
Soutenance Zend Framework vs SymfonySoutenance Zend Framework vs Symfony
Soutenance Zend Framework vs SymfonyVincent Composieux
 
Utiliser le Zend Framework avec Symfony
Utiliser le Zend Framework avec SymfonyUtiliser le Zend Framework avec Symfony
Utiliser le Zend Framework avec SymfonyXavier Gorse
 
Plateforme De DéVeloppement En Php5 (Zend + Doctrine)
Plateforme De DéVeloppement En Php5 (Zend + Doctrine)Plateforme De DéVeloppement En Php5 (Zend + Doctrine)
Plateforme De DéVeloppement En Php5 (Zend + Doctrine)cornnery
 
AlterWay SolutionsLinux Outils Industrialisation PHP
AlterWay SolutionsLinux Outils Industrialisation PHPAlterWay SolutionsLinux Outils Industrialisation PHP
AlterWay SolutionsLinux Outils Industrialisation PHPjulien pauli
 
Présentation de PHP 5.4 [FR]
Présentation de PHP 5.4 [FR]Présentation de PHP 5.4 [FR]
Présentation de PHP 5.4 [FR]Wixiweb
 

Tendances (20)

Atelier Symfony2- Introduction
Atelier Symfony2- IntroductionAtelier Symfony2- Introduction
Atelier Symfony2- Introduction
 
Présentation symfony epita
Présentation symfony epitaPrésentation symfony epita
Présentation symfony epita
 
Presentation Symfony2
Presentation Symfony2Presentation Symfony2
Presentation Symfony2
 
Orchestrez vos projets Symfony sans fausses notes
Orchestrez vos projets Symfony sans fausses notesOrchestrez vos projets Symfony sans fausses notes
Orchestrez vos projets Symfony sans fausses notes
 
Symfony 2 : chapitre 2 - Les vues en Twig
Symfony 2 : chapitre 2 - Les vues en TwigSymfony 2 : chapitre 2 - Les vues en Twig
Symfony 2 : chapitre 2 - Les vues en Twig
 
Symfony2: 30 astuces et bonnes pratiques
Symfony2: 30 astuces et bonnes pratiquesSymfony2: 30 astuces et bonnes pratiques
Symfony2: 30 astuces et bonnes pratiques
 
Introduction à Symfony2
Introduction à Symfony2Introduction à Symfony2
Introduction à Symfony2
 
Symfony 2 et le Web
Symfony 2 et le WebSymfony 2 et le Web
Symfony 2 et le Web
 
Présentation de symfony - Human talks aux docks le 8 juillet 2014
Présentation de symfony - Human talks aux docks le 8 juillet 2014Présentation de symfony - Human talks aux docks le 8 juillet 2014
Présentation de symfony - Human talks aux docks le 8 juillet 2014
 
Django pour les développeurs Symfony (et réciproquement)
Django pour les développeurs Symfony (et réciproquement)Django pour les développeurs Symfony (et réciproquement)
Django pour les développeurs Symfony (et réciproquement)
 
wallabag, comment on a migré vers symfony3
wallabag, comment on a migré vers symfony3wallabag, comment on a migré vers symfony3
wallabag, comment on a migré vers symfony3
 
Exposer des services web SOAP et REST avec symfony 1.4 et Zend Framework
Exposer des services web SOAP et REST avec symfony 1.4 et Zend FrameworkExposer des services web SOAP et REST avec symfony 1.4 et Zend Framework
Exposer des services web SOAP et REST avec symfony 1.4 et Zend Framework
 
Symfony 2 : chapitre 4 - Les services et les formulaires
Symfony 2 : chapitre 4 - Les services et les formulairesSymfony 2 : chapitre 4 - Les services et les formulaires
Symfony 2 : chapitre 4 - Les services et les formulaires
 
Formation Symfony2 par KNP Labs
Formation Symfony2 par KNP LabsFormation Symfony2 par KNP Labs
Formation Symfony2 par KNP Labs
 
PHP5 et Zend Framework
PHP5 et Zend FrameworkPHP5 et Zend Framework
PHP5 et Zend Framework
 
Soutenance Zend Framework vs Symfony
Soutenance Zend Framework vs SymfonySoutenance Zend Framework vs Symfony
Soutenance Zend Framework vs Symfony
 
Utiliser le Zend Framework avec Symfony
Utiliser le Zend Framework avec SymfonyUtiliser le Zend Framework avec Symfony
Utiliser le Zend Framework avec Symfony
 
Plateforme De DéVeloppement En Php5 (Zend + Doctrine)
Plateforme De DéVeloppement En Php5 (Zend + Doctrine)Plateforme De DéVeloppement En Php5 (Zend + Doctrine)
Plateforme De DéVeloppement En Php5 (Zend + Doctrine)
 
AlterWay SolutionsLinux Outils Industrialisation PHP
AlterWay SolutionsLinux Outils Industrialisation PHPAlterWay SolutionsLinux Outils Industrialisation PHP
AlterWay SolutionsLinux Outils Industrialisation PHP
 
Présentation de PHP 5.4 [FR]
Présentation de PHP 5.4 [FR]Présentation de PHP 5.4 [FR]
Présentation de PHP 5.4 [FR]
 

Similaire à Symfony Best Practices

20090615 - Ch'ti JUG - Apache Maven
20090615 - Ch'ti JUG - Apache Maven20090615 - Ch'ti JUG - Apache Maven
20090615 - Ch'ti JUG - Apache MavenArnaud Héritier
 
Présentation de Django @ Orange Labs (FR)
Présentation de Django @ Orange Labs (FR)Présentation de Django @ Orange Labs (FR)
Présentation de Django @ Orange Labs (FR)Martin Latrille
 
Spring Boot & Containers - Do's & Don'ts
Spring Boot & Containers - Do's & Don'tsSpring Boot & Containers - Do's & Don'ts
Spring Boot & Containers - Do's & Don'tsJulien Wittouck
 
20081113 - Nantes Jug - Apache Maven
20081113 - Nantes Jug - Apache Maven20081113 - Nantes Jug - Apache Maven
20081113 - Nantes Jug - Apache MavenArnaud Héritier
 
20081008 - Tours Jug - Apache Maven
20081008  - Tours Jug - Apache Maven20081008  - Tours Jug - Apache Maven
20081008 - Tours Jug - Apache MavenArnaud Héritier
 
Presentation du socle technique Java open source Scub Foundation
Presentation du socle technique Java open source Scub FoundationPresentation du socle technique Java open source Scub Foundation
Presentation du socle technique Java open source Scub FoundationStéphane Traumat
 
20081023 - Paris Vi Master STL TA - Initiation Maven
20081023 - Paris Vi Master STL TA - Initiation Maven20081023 - Paris Vi Master STL TA - Initiation Maven
20081023 - Paris Vi Master STL TA - Initiation MavenArnaud Héritier
 
Cours Devops Sparks.pptx.pdf
Cours Devops Sparks.pptx.pdfCours Devops Sparks.pptx.pdf
Cours Devops Sparks.pptx.pdfboulonvert
 
10 tips pour améliorer les performances de vos applications Windows 8
10 tips pour améliorer les performances de vos applications Windows 810 tips pour améliorer les performances de vos applications Windows 8
10 tips pour améliorer les performances de vos applications Windows 8Microsoft
 
Enib cours c.a.i. web - séance #6 : autour de la webapp
Enib   cours c.a.i. web - séance #6 : autour de la webappEnib   cours c.a.i. web - séance #6 : autour de la webapp
Enib cours c.a.i. web - séance #6 : autour de la webappHoracio Gonzalez
 
20091020 - Normandy Jug - Builders Battle
20091020 - Normandy Jug - Builders Battle20091020 - Normandy Jug - Builders Battle
20091020 - Normandy Jug - Builders BattleArnaud Héritier
 
[Scrum Day 2011] Outillage Agile dans un environnement Microsoft
[Scrum Day 2011] Outillage Agile dans un environnement Microsoft[Scrum Day 2011] Outillage Agile dans un environnement Microsoft
[Scrum Day 2011] Outillage Agile dans un environnement MicrosoftChristophe HERAL
 
Cours n°1.1-Introduction.pdf angularrrrr
Cours n°1.1-Introduction.pdf angularrrrrCours n°1.1-Introduction.pdf angularrrrr
Cours n°1.1-Introduction.pdf angularrrrrinesrdissi60
 
PyConFR - testons en python
PyConFR - testons en pythonPyConFR - testons en python
PyConFR - testons en pythongburet
 
Gulp fiction, Builder, tester, livrer, sans tomber dans les poms - breizhcam...
Gulp fiction, Builder, tester, livrer, sans tomber dans les poms  - breizhcam...Gulp fiction, Builder, tester, livrer, sans tomber dans les poms  - breizhcam...
Gulp fiction, Builder, tester, livrer, sans tomber dans les poms - breizhcam...mbrechet
 
Scub Foundation, usine logicielle Java libre
Scub Foundation, usine logicielle Java libreScub Foundation, usine logicielle Java libre
Scub Foundation, usine logicielle Java libreStéphane Traumat
 

Similaire à Symfony Best Practices (20)

20090615 - Ch'ti JUG - Apache Maven
20090615 - Ch'ti JUG - Apache Maven20090615 - Ch'ti JUG - Apache Maven
20090615 - Ch'ti JUG - Apache Maven
 
Présentation de Django @ Orange Labs (FR)
Présentation de Django @ Orange Labs (FR)Présentation de Django @ Orange Labs (FR)
Présentation de Django @ Orange Labs (FR)
 
Spring Boot & Containers - Do's & Don'ts
Spring Boot & Containers - Do's & Don'tsSpring Boot & Containers - Do's & Don'ts
Spring Boot & Containers - Do's & Don'ts
 
20081113 - Nantes Jug - Apache Maven
20081113 - Nantes Jug - Apache Maven20081113 - Nantes Jug - Apache Maven
20081113 - Nantes Jug - Apache Maven
 
20081008 - Tours Jug - Apache Maven
20081008  - Tours Jug - Apache Maven20081008  - Tours Jug - Apache Maven
20081008 - Tours Jug - Apache Maven
 
Angular 11
Angular 11Angular 11
Angular 11
 
Presentation du socle technique Java open source Scub Foundation
Presentation du socle technique Java open source Scub FoundationPresentation du socle technique Java open source Scub Foundation
Presentation du socle technique Java open source Scub Foundation
 
20081023 - Paris Vi Master STL TA - Initiation Maven
20081023 - Paris Vi Master STL TA - Initiation Maven20081023 - Paris Vi Master STL TA - Initiation Maven
20081023 - Paris Vi Master STL TA - Initiation Maven
 
Cours Devops Sparks.pptx.pdf
Cours Devops Sparks.pptx.pdfCours Devops Sparks.pptx.pdf
Cours Devops Sparks.pptx.pdf
 
10 tips pour améliorer les performances de vos applications Windows 8
10 tips pour améliorer les performances de vos applications Windows 810 tips pour améliorer les performances de vos applications Windows 8
10 tips pour améliorer les performances de vos applications Windows 8
 
Octo Maven.pdf
Octo Maven.pdfOcto Maven.pdf
Octo Maven.pdf
 
Enib cours c.a.i. web - séance #6 : autour de la webapp
Enib   cours c.a.i. web - séance #6 : autour de la webappEnib   cours c.a.i. web - séance #6 : autour de la webapp
Enib cours c.a.i. web - séance #6 : autour de la webapp
 
20091020 - Normandy Jug - Builders Battle
20091020 - Normandy Jug - Builders Battle20091020 - Normandy Jug - Builders Battle
20091020 - Normandy Jug - Builders Battle
 
[Scrum Day 2011] Outillage Agile dans un environnement Microsoft
[Scrum Day 2011] Outillage Agile dans un environnement Microsoft[Scrum Day 2011] Outillage Agile dans un environnement Microsoft
[Scrum Day 2011] Outillage Agile dans un environnement Microsoft
 
Cours n°1.1-Introduction.pdf angularrrrr
Cours n°1.1-Introduction.pdf angularrrrrCours n°1.1-Introduction.pdf angularrrrr
Cours n°1.1-Introduction.pdf angularrrrr
 
PyConFR - testons en python
PyConFR - testons en pythonPyConFR - testons en python
PyConFR - testons en python
 
Gulp fiction, Builder, tester, livrer, sans tomber dans les poms - breizhcam...
Gulp fiction, Builder, tester, livrer, sans tomber dans les poms  - breizhcam...Gulp fiction, Builder, tester, livrer, sans tomber dans les poms  - breizhcam...
Gulp fiction, Builder, tester, livrer, sans tomber dans les poms - breizhcam...
 
Installation open erp
Installation open erpInstallation open erp
Installation open erp
 
Scub Foundation, usine logicielle Java libre
Scub Foundation, usine logicielle Java libreScub Foundation, usine logicielle Java libre
Scub Foundation, usine logicielle Java libre
 
Forum PHP 2014 day 1
Forum PHP 2014 day 1Forum PHP 2014 day 1
Forum PHP 2014 day 1
 

Symfony Best Practices

  • 1. Le guide du code 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 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
  • 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 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.
  • 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 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
  • 29. Organiser votre application Vous pouvez aussi faire ça ! Création d'un unique bundle AppBundle par application logique.
  • 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
  • 33. Organiser votre application Les autres recommandations – ORM ● Stocker les entités dans src/Namespace/MyBundle/Entity
  • 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.
  • 44. Les contrôleurs ● Template Il est déconseillé d'utiliser l'annotation @Template
  • 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)
  • 49. Les templates ● Utilisation de Twig ● Stocker les templates globaux dans app/Resources/views
  • 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é… »
  • 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
  • 58. Internationalisation ● Multiples choix de format – PHP – Qt – .po – .mo – JSON – CSV – INI – XLIFF
  • 59. Internationalisation ● Multiples choix de format – PHP – Qt – .po – .mo – JSON – CSV – INI – XLIFF Conseillé par Sensio
  • 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. Internationalisation ● On stocke tous nos traductions dans app/Resources/translations ● On utilise des clés pour traduire notre contenu
  • 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. Sécurité ● Gestion des autorisations – Protéger les URL globales via le security.yml
  • 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.