Symfony Best Practices
-
Upload
baptiste-donaux -
Category
Technology
-
view
1.024 -
download
1
description
Transcript of Symfony Best Practices
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 [email protected]
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 environnementapp/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 applicationLes autres recommandations - Service● Utilisation du format YAML
XML très répandu mais plus verbeux
Organiser votre applicationLes 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 applicationLes autres recommandations – ORM● Stocker les entités dans
src/Namespace/MyBundle/Entity
Organiser votre applicationLes 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 applicationLes 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 applicationCoding 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 applicationCoding 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 StandardsRecommendation
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
– XLIFFConseillé par
Sensio
Internationalisation
● Multiples choix de format– PHP
– Qt
– .po
– .mo
– JSON
– CSV
– INI
– XLIFFConseillé par
Sensio
On aime bien Qtet 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.