Symfony - Ce que j'aurais aimé savoir plus tôt
Cet article regroupe un ensemble d'éléments, d'options ou de pratiques que j'aurai aimé connaître plus tôt lorsque j'ai commencé l'apprentissage du framework Symfony.
Certaines touchent au framework même, tandis que d'autres gravitent autour.
J'ai préféré découper par point, l'ordre étant totalement arbitraire.
Cheat Sheets
Andréia Bohner a réalisé plusieurs cheat sheets symfony. Si vous n'êtes pas branché documentation ou souhaitez simplement conserver des condensés sur des thèmes bien précis, vous trouverez de belles feuilles.
Performance
Il existe une documentation sur la performance, peut-être bien pas assez mise en avant.
Je vous conseille notamment l'augmentation du cache realpath dans la configuration PHP, même en développement. Cela a pour mon cas amélioré drastiquement les performances quand je travaillais sous windows.
Note à part, l'utilisation de symfony check:req
peut également vous donner des indications.
framework.yaml
Il existe une clé IDE permettant de spécifier l'éditeur/IDE utilisé pendant le développement (phpstorm, vscode...).
# config/packages/framework.yaml
framework:
ide: 'phpstorm'
Celle-ci permet d'améliorer l'expérience développeur en proposant des liens d'ouverture rapide dans l'IDE depuis le profiler.
monolog.yaml
Pour les logs de production, il peut être laborieux d'avoir un gigantesque fichier prod.log.
C'est là qu'interviennent deux clés, type
et max_files
.
# config/packages/prod/monolog.yaml
monolog:
handlers:
main:
type: rotating_file
path: '%kernel.logs_dir%/%kernel.environment%.log'
level: debug
# max number of log files to keep
# defaults to zero, which means infinite files
max_files: 10
Vous pouvez paramétrer monolog pour qu'il crée un fichier par jour avec type: rotating file et même spécifier une limite sur le nombre de fichiers à conserver avec max_files.
NotCompromisedPassword
Il existe une règle de validation NotCompromisedPassword vérifiant que le mot de passe n'est pas répertorié sur haveibeenpwned.com.
Néanmoins je ne recommande pas forcément de l'utiliser. Cela peut provoquer un ralentissement perceptible de la réponse (appel API) et si le service est down ne pas faire cette vérification.
composer.json - config.platform
Il existe une clé config.platform
dans le fichier composer.json.
"config": {
"platform": {
"php": "7.2.5"
},
// ...
},
Dans cet exemple, elle indique à composer de faire comme si nous utilisions la version 7.2.5 lors de l'installation de dépendances, même si la version php du path est supérieure.
Admettons que le serveur de production utilise php 7.2.5 et que notre machine locale utilise php 7.4.1. Avec ce paramètre, on s'assure de ne pas télécharger des paquets qui fonctionneraient sur la 7.4.1 mais exploseraient sur la 7.2.5 (donc lors de la mise en production) !
Comme la documentation l'explique, on peut donc "émuler" la version de PHP utilisée. Par cohérence, il est intéressant d'utiliser la même version que la clé require.
"require": {
"php": "^7.2.5",
// ...
},
"config": {
"platform": {
"php": "7.2.5"
},
// ...
},
Pourquoi est-ce d'autant plus intéressant dans un projet Symfony ? Parce que nos projets ont généralement plus d'une centaine de dépendances...
Api Platform
Envie de consulter rapidement les données depuis votre navigateur ? Ajoutez simplement l'extension désirée à la fin de l'url.
Par exemple, si vous avez une entité "User", vous avez accès aux urls /api/users.json
et api/users.jsonld
.
Makefile
Certains connaissent, d'autres non. Pour ma part j'ai découvert ce fichier d'automatisation avec Symfony. Et comme je m'en sers tous les jours (gain de temps énorme), il mérite sa place. A ce sujet, j'ai partagé SymMakefile pour les besoins les plus communs dans un projet Symfony et j'ai soumis une PR sur maker-bundle pour ajouter la prise en charge d'un générateur de Makefile.
Il s'agit ni plus ni moins d'un fichier répertoriant différentes commandes pour un projet. On peut effectuer plusieurs actions avec une seule commande.
Pour illustrer ceci, avec un make install
nous pourrions installer les dépendances PHP & Node.js, construire les assets (et pourquoi pas lancer le serveur web).
En changeant de branche git, une fois encore make install
, celui-ci ne reconstruirait les dossiers vendor
ou node_modules
uniquement si besoin !
Utilisateurs Windows, vous pouvez aussi l'utiliser.
Linters
Il existe divers linters disponibles avec bin/console
.
# Analyse le dossier "templates" en environnement de production (nécessite twig)
lint:twig templates -e prod
# Analyse les fichiers xliff dans "translations"
lint:xliff translations
# Analyse les fichiers yaml dans "config" et "translations"
lint:yaml config translations
# Vérifie les services dans le container
lint:container
lint:container
est le petit dernier et nécessite au moins Symfony 4.4
Commandes
Il n'est pas obligatoire de rédiger les commandes entièrement.
Nous pouvons très bien utiliser bin/console d:d:c
à la place de bin/console doctrine:database:create
.
Cependant, attention. En fonction de la saisie, le binaire peut ne pas être en mesure de savoir quelle commande appeler.
Exemple avec le maker bundle. bin/console m:v
, aujourd'hui la commande peut faire référence à maker:validator
ou make:voter
.
Vous devrez donc être plus explicite et utiliser bin/console m:va
ou make:vo
.
Il n'est donc pas recommandé d'utiliser ces "raccourcis" dans des scripts externes.
bin/console -v
bin/console -V
retourne la version symfony de l'application ainsi que APP_ENV
et APP_DEBUG
.
Symfony 5.2.1 (env: dev, debug: true)
Il est donc inutile d'ouvrir un fichier dans un éditeur pour connaître ces informations.
Conclusion
Certaines astuces peuvent nous rendre plus productifs. Autant en profiter.
En espérant que l'un de ces points vous étiez inconnu !