Tag Archives: Symfony


Symfony2 compiler pass with tags and custom attributes

It passed about half year since I scrat­ched Symfony2 Frame­work surface. Basics are behind me, now it’s time for middle-level stuff. I’m exci­ted to start a whole new Symfony rela­ted blog post series. I didn’t wanted to copy typi­cal tuto­rial topics. It would be waste of your time and my work. I thought it would be nice to show some code rela­ted to Symfony Depen­dency Injec­tion Conta­iner.

Tuto­rials usually show typi­cal conta­iner servi­ces defi­ni­tion. Boring stuff. I’m going to show you dyna­mic collec­tion of servi­ces passed into proces­sor service. The idea is that collec­tion doesn’t know its elements, so every bundle can define its own servi­ces to be added to collec­tion. The secret is tags. To add some spice, tagged service can be defi­ned with prio­rity. And we can specify that this proces­sor should be run at the begin­ning, and that at the end.

We’ll start with defi­ning common proces­sor inter­face and some basic imple­men­ta­tions.

Now it’s time for a service that proces­ses given argu­ment with all the proces­sors one by one.

We could define typi­cal conta­iner defi­ni­tions and pass proces­sors right into proces­sing service, but remem­ber about requ­ire­ment that exter­nal bundles can define their own proces­sors. We’ll use tags.

Now the key part: compi­ler pass defi­ni­tion.


At the first sight you may think that it’s a lot of logic to run to define stupid proces­sor. What about perfor­mance? No worries. Remem­ber, the compi­la­tion outcome is dumped into cache file on prod envi­ron­ment. All these fore­ach loops and prio­rity queues are being run only once.

Solu­tion is pretty gene­ric, you can easily adapt to your own needs. Of course code is on MIT license, so grab it and use in your own (even commer­cial) projects!

Happy PHP conta­iner compiling :-)