@@ -405,3 +405,92 @@ The double loop may be confusing. This is because a service can have more
405405than one tag. You tag a service twice or more with the ``app.mail_transport ``
406406tag. The second foreach loop iterates over the ``app.mail_transport ``
407407tags set for the current service and gives you the attributes.
408+
409+ Reference tagged services
410+ ~~~~~~~~~~~~~~~~~~~~~~~~~
411+
412+ In case your tag doesn't require any further additional attributes writing compiler
413+ passes per tag might become tedious. A way to overcome this is is to make your compiler
414+ pass more generic. The downside of this approach is you have to write and maintain
415+ additional code, considering you want to reuse it over multiple projects.
416+
417+ ThereBecause this task is so generic and common to do, Symfony provides a way to achieve this
418+ directly in your service container confguration. This enables to inject services tagged
419+ with e.g. `app.handler ` into another service that collects all handlers.
420+
421+ .. configuration-block ::
422+
423+ .. code-block :: yaml
424+
425+ services :
426+ App\Handler\One :
427+ tags : [app.handler]
428+
429+ App\Handler\Two :
430+ tags : [app.handler]
431+
432+ App\HandlerCollection :
433+ arguments : [!tagged app.handler]
434+
435+ .. code-block :: xml
436+
437+ <?xml version =" 1.0" encoding =" UTF-8" ?>
438+ <container xmlns =" http://symfony.com/schema/dic/services"
439+ xmlns : xsi =" http://www.w3.org/2001/XMLSchema-instance"
440+ xsi : schemaLocation =" http://symfony.com/schema/dic/services
441+ http://symfony.com/schema/dic/services/services-1.0.xsd" >
442+
443+ <services >
444+ <service id =" App\Handler\One" >
445+ <tag name =" app.handler" />
446+ </service >
447+
448+ <service id =" App\Handler\Two" >
449+ <tag name =" app.handler" />
450+ </service >
451+
452+ <service id =" App\HandlerCollection" >
453+ <argument type =" tagged" tag =" app.handler" />
454+ </service >
455+ </services >
456+ </container >
457+
458+ .. code-block :: php
459+
460+ use Symfony\Component\DependencyInjection\Argument\TaggedIteratorArgument;
461+
462+ $container->register(\App\Handler\One::class)
463+ ->addTag('app.handler');
464+
465+ $container->register(\App\Handler\One::class)
466+ ->addTag('app.handler');
467+
468+ $container->register(\App\HandlerCollection::class)
469+ ->addArgument(new TaggedIteratorArgument('app.handler'));
470+
471+ After compilation the `HandlerCollection ` service is able to iterate over your application handlers.
472+
473+ .. code-block :: php
474+
475+ class HandlerCollection
476+ {
477+ public function __construct(iterable $handlers)
478+ {
479+ }
480+ }
481+
482+ .. tip ::
483+
484+ The collected services can be prioritized using the `priority ` attribute.
485+
486+ .. code-block :: yaml
487+
488+ services :
489+ App\Handler\One :
490+ tags :
491+ - { name: app.handler, priority: 20 }
492+
493+ .. versionadded :: 3.4
494+
495+ Support for the tagged service notation in YAML, XML and PHP was introduced
496+ in Symfony 3.4.
0 commit comments