Symfony Best Practices

Post on 07-Jul-2015

1.025 views 1 download

description

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

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 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 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.