Le Compiler Pass de Symfony 🔥
Une des fonctionnalités les plus puissante de Symfony est le container de service et l’injection de dépendance, il permet de manipuler la définition des services de différentes manières et permet de résoudre des problèmes complexe avec des solutions simple.
Dans cet article, je vais vous montrer comment vous pouvez manipuler la définition d’un service au runtime 🚀.
Notre cas d’utilisation est simple, nous avons une application dans de nombreux pays, chaque pays a des paramètres spécifiques mais ils ont le même code source applicatif, et selon l’endroit où l’application est déployée, nous voulons un debugger spécifique.
Dans le contexte français, nous avons 2 debuggers et dans le contexte anglais, nous avons un debugger, lorsque nous avons besoin de debugger, nous voulons itérer sur tous les debuggers disponibles selon le contexte (francais ou anglais).
1. Creation du ChainDebugger đź”—
La classe ChainDebugger est la classe finale utilisée pour debugger, son job est d’itérer sur tous les debuggers disponibles et d’appeler la méthode debug
2. Creation des Debuggers 🥖
Je vais créer 3 debuggers, 2 pour le contexte français et 1 pour le contexte britannique, tous doivent implémenter une interface, qui les oblige à avoir un contrat et cela nous permet de dire à Symfony: “Hé donne-moi tous les services avec cette interface “
3. Definition du service✏️
Après création des classes nous devons ajouter un tag pour chaque service afin de pouvoir les récupérer par leur tag
4. Le Compiler Pass đź’ˇ
Ă€ ce stade, nous avons un ChainDebugger
et nous avons 3 debuggers, la mission est d’ajouter nos débogueurs dans le ChainDebugger
mais nous ne voulons pas ajouter tous les debuggers, nous voulons DebuggerForFrenchContext
et DebuggerCheeseForFrenchContext
pour le contexte français et DebbugerForUKContext
pour le contexte britannique .
Chaque application a un contexte passé en paramètre dans la configuration mais cela peut être une variable d’environnement ou quelque chose dans la base de données… Cela n’a pas d’importance ici.
Ce que nous allons faire:
- Récupérer le contexte ( “fr” ou “uk”) via notre paramètre
context
- Récupérer
ChainDebbuger
depuis le container - Récupérer tous les debuggers disponibles avec le tag
app.custom_debug_fr
ouapp.custom_debug_uk
- Ajouter chaque Debugger dans le service
ChainDebbuger
avec la méthodeaddDebugger
- Dire à Symfony d’enregistrer notre CompilerPass
5. Testons 🎉
C’est tout !
J’espère que vous l’avez apprécié, n’oubliez pas de l’applaudir et de le partager!