@@ -405,3 +405,92 @@ The double loop may be confusing. This is because a service can have more
405
405
than one tag. You tag a service twice or more with the ``app.mail_transport ``
406
406
tag. The second foreach loop iterates over the ``app.mail_transport ``
407
407
tags 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