Le Compiler Pass de Symfony 🔥

Smaine Milianni
2 min readDec 13, 2020

(english version here)

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 ChainDebuggeret 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 ou app.custom_debug_uk
  • Ajouter chaque Debugger dans le serviceChainDebbuger 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!

--

--

Smaine Milianni

Fullstack Developer- certified Symfony 4,5 and certified AWS Solution Architect - Freelancer - Remote Worker