Override a symfony service tag with a compiler pass -


i'm trying override tag in symfony service definition compiler pass. service example data_collector.translation.

the goal deactivate data collector service disable element in symfony web developer toolbar. this, have set priority of data_collector tag 0.

i override in own service definition:

services:      data_collector.translation:         class: 'symfony\component\translation\datacollector\translationdatacollector'         tags:            - {name: 'data_collector', priority: '0'}         arguments: [@translator.data_collector] 

but want few of data collectors, need know mandatory arguments data collector definition. priority works same collectors , therefore need name of collector disable it.

so wrote following compiler pass:

class datacollectorcompilerpass implements compilerpassinterface {     public function process(containerbuilder $container)     {         if (!$container->hasdefinition('data_collector.translation')) {             return;         }         $definition = $container->getdefinition('data_collector.translation');          $tags = $definition->gettags();          $tags['data_collector'][0]['priority'] = 0;          $definition->settags($tags);          $container->setdefinition('data_collector.translation', $definition);     } } 

to make things more wired: when run command:

$ php app/console container:debug --show-private --tag='data_collector' 

i following output:

data_collector.translation @webprofiler/collector/translation.html.twig translation 0 symfony\component\translation\datacollector\translationdatacollector 

so priority in debugger set 0.

but reason ever element still shown in toolbar.

what did wrong here? there mechanism overwriting tag within compiler pass?

the compiler pass run (tested printing out stuff)
i'm using symfony 2.7.1

turns out code work, problem is, compilerpass run after profilerpass part of frameworkbundle. putting bundle compilerpass before frameworkbundle in appkernel solves problem (more information here). not initiating data collectors it's better remove tags instead of setting priority 0.

that's final solution looks like:

class datacollectorcompilerpass implements compilerpassinterface {     public function process(containerbuilder $container)     {         $collectorstoremove = [             'data_collector.form',             'data_collector.translation',             'data_collector.logger',             'data_collector.ajax',             'data_collector.twig'         ];          foreach($collectorstoremove $datacollector) {              if (!$container->hasdefinition($datacollector)) {                 continue;             }             $definition = $container->getdefinition($datacollector);              $definition->cleartags();         }     } } 

Comments