Symfony Best Practices

75
Le guide du code propre

description

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

Transcript of Symfony Best Practices

Page 1: Symfony Best Practices

Le guide du code propre

Page 2: Symfony Best Practices

Hello World

● Wanadev, créé en 2009● Basé à Lyon● Prestation Symfony2● WebGL power

Page 3: Symfony Best Practices

● Baptiste Donaux, développeur Symfony● Twitter @baptistedonaux● Gmail [email protected]

Hello World

Page 4: Symfony Best Practices

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

Page 5: Symfony Best Practices

Best Practices

Le Best Practices, qu'est-ce que ce n'est pas ?● Un tutoriel● Une checklist à valider pour déployer son

application

Page 6: Symfony Best Practices

Best Practices

Il a pour but de conseiller et de guider les développeurs, de manière à uniformiser le code.

Page 7: Symfony Best Practices

Sommaire

● Créer un projet● Configurer un projet● Organiser votre application● Les contrôleurs● Les templates● Les formulaires● Internationalisation● Sécurité● Assets● Tests

Page 8: Symfony Best Practices

Partie 1

Créer un projet

Page 9: Symfony Best Practices

Créer un projet

● Toujours utiliser Composer

Page 10: Symfony Best Practices

Créer un projet

● Toujours utiliser Composer● Résolution des dépendances

automatiques

Page 11: Symfony Best Practices

Créer un projet

● Toujours utiliser Composer● Résolution des dépendances

automatiques● Installation automatique des assets

Page 12: Symfony Best Practices

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

Page 13: Symfony Best Practices

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

Page 14: Symfony Best Practices

Créer un projet

Un bundle doit être standalone.$ php app/console generate:bundle

Création d'un unique bundle AppBundle par application logique.

Page 15: Symfony Best Practices

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.

Page 16: Symfony Best Practices

Partie 2

Configurer un projet

Page 17: Symfony Best Practices

Configurer un projet

● Définition des variables dynamiques dans parameters.yml

Page 18: Symfony Best Practices

Configurer un projet

● Définition des variables dynamiques dans parameters.yml

Non versionné

Page 19: Symfony Best Practices

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é

Page 20: Symfony Best Practices

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é

Page 21: Symfony Best Practices

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

Page 22: Symfony Best Practices

Configurer un projet

Comment savoir si mes variables sont dynamiques ou statiques ?

Une variable est constante pour les variables qui changent peu.

Page 23: Symfony Best Practices

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

Page 24: Symfony Best Practices

Partie 3

Organiser votre application

Page 25: Symfony Best Practices

Organiser votre application

Cela ne nous empêche pas d'organiser notre code !

Création d'un unique bundle AppBundle par application logique.

Page 26: Symfony Best Practices

Organiser votre application

Cela ne nous empêche pas d'organiser notre code !

Création d'un unique bundle AppBundle par application logique.

Page 27: Symfony Best Practices

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

Page 28: Symfony Best Practices

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

Page 29: Symfony Best Practices

Organiser votre application

Vous pouvez aussi faire ça !

Création d'un unique bundle AppBundle par application logique.

Page 30: Symfony Best Practices

Organiser votre application

Vous pouvez aussi faire ça !

Création d'un unique bundle AppBundle par application logique.

Et c'est conseillépar Sensio !

Page 31: Symfony Best Practices

Organiser votre applicationLes autres recommandations - Service● Utilisation du format YAML

XML très répandu mais plus verbeux

Page 32: Symfony Best Practices

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

Page 33: Symfony Best Practices

Organiser votre applicationLes autres recommandations – ORM● Stocker les entités dans

src/Namespace/MyBundle/Entity

Page 34: Symfony Best Practices

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

Page 35: Symfony Best Practices

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

Page 36: Symfony Best Practices

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.

Page 37: Symfony Best Practices

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

Page 38: Symfony Best Practices

Partie 4

Les contrôleurs

Page 39: Symfony Best Practices

Les contrôleurs

● Les contrôleurs doivent être réalisés en respectant la règle « 5-10-20 »

Page 40: Symfony Best Practices

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

Page 41: Symfony Best Practices

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.

Page 42: Symfony Best Practices

Les contrôleurs

● Ils doivent hériter du contrôleur de base du FrameworkBundle (Sensio).

Utilisation du container

Page 43: Symfony Best Practices

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.

Page 44: Symfony Best Practices

Les contrôleurs

● Template

Il est déconseillé d'utiliser l'annotation @Template

Page 45: Symfony Best Practices

Les contrôleurs

● Template

Il est déconseillé d'utiliser l'annotation @Template● ParamConverter

Conseillé pour les cas simples

Page 46: Symfony Best Practices

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

Page 47: Symfony Best Practices

Partie 5

Les templates

Page 48: Symfony Best Practices

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)

Page 49: Symfony Best Practices

Les templates

● Utilisation de Twig● Stocker les templates globaux dans

app/Resources/views

Page 50: Symfony Best Practices

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

Page 51: Symfony Best Practices

Partie 6

Les forms

Page 52: Symfony Best Practices

Les forms

● Définir des forms pour chaque entité

Intégration complète dans Symfony

Page 53: Symfony Best Practices

Les forms

● Déclaration d'un form comme service

Jacques a dit : « Vous pouvez aussi enregistrer vos formulaires comme un service… »

Page 54: Symfony Best Practices

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é… »

Page 55: Symfony Best Practices

Les forms

● Possibilité d'ajout de bouton directement depuis le form, mais pas conseillé

Page 56: Symfony Best Practices

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

Page 57: Symfony Best Practices

Partie 7

Internationalisation

Page 58: Symfony Best Practices

Internationalisation

● Multiples choix de format– PHP

– Qt

– .po

– .mo

– JSON

– CSV

– INI

– XLIFF

Page 59: Symfony Best Practices

Internationalisation

● Multiples choix de format– PHP

– Qt

– .po

– .mo

– JSON

– CSV

– INI

– XLIFFConseillé par

Sensio

Page 60: Symfony Best Practices

Internationalisation

● Multiples choix de format– PHP

– Qt

– .po

– .mo

– JSON

– CSV

– INI

– XLIFFConseillé par

Sensio

On aime bien Qtet son outil

Page 61: Symfony Best Practices

Internationalisation

● On stocke tous nos traductions dans app/Resources/translations

● On utilise des clés pour traduire notre contenu

Page 62: Symfony Best Practices

Partie 8

Sécurité

Page 63: Symfony Best Practices

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

Page 64: Symfony Best Practices

Sécurité

● Gestion des autorisations– Protéger les URL globales via le security.yml

Page 65: Symfony Best Practices

Sécurité

● Gestion des autorisations– Protéger les URL globales via le security.yml

– Utiliser les annotations @Security

Page 66: Symfony Best Practices

Sécurité

● Gestion des autorisations– Protéger les URL globales via le security.yml

– Utiliser les annotations @Security

– On évite d'utiliser @Secure

Page 67: Symfony Best Practices

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

Page 68: Symfony Best Practices

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

Page 69: Symfony Best Practices

Partie 9

Assets

Page 70: Symfony Best Practices

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

Page 71: Symfony Best Practices

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.

Page 72: Symfony Best Practices

Partie 10

Tests

Page 73: Symfony Best Practices

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

Page 74: Symfony Best Practices

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

Page 75: Symfony Best Practices

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.