Skip to content

Commit ae734d0

Browse files
[DependencyInjection] Add method priority for tagged services
1 parent c681bd7 commit ae734d0

File tree

1 file changed

+77
-32
lines changed

1 file changed

+77
-32
lines changed

service_container/tags.rst

Lines changed: 77 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -570,47 +570,92 @@ application handlers::
570570
}
571571
}
572572

573-
.. tip::
573+
Prioritizing tagged services
574+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
575+
576+
The tagged services can be prioritized using the ``priority`` attribute:
577+
578+
.. configuration-block::
579+
580+
.. code-block:: yaml
581+
582+
# config/services.yaml
583+
services:
584+
App\Handler\One:
585+
tags:
586+
- { name: 'app.handler', priority: 20 }
587+
588+
.. code-block:: xml
589+
590+
<!-- config/services.xml -->
591+
<?xml version="1.0" encoding="UTF-8" ?>
592+
<container xmlns="http://symfony.com/schema/dic/services"
593+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
594+
xsi:schemaLocation="http://symfony.com/schema/dic/services
595+
http://symfony.com/schema/dic/services/services-1.0.xsd">
596+
597+
<services>
598+
<service id="App\Handler\One">
599+
<tag name="app.handler" priority="20"/>
600+
</service>
601+
</services>
602+
</container>
603+
604+
.. code-block:: php
605+
606+
// config/services.php
607+
$container->register(App\Handler\One::class)
608+
->addTag('app.handler', ['priority' => 20]);
609+
610+
Note that any other custom attributes will be ignored by this feature.
611+
612+
613+
Another option, which is particularly useful when using autoconfiguring tags, is to implement the ``getDefaultPriority`` static method on a collected class::
574614

575-
The collected services can be prioritized using the ``priority`` attribute:
615+
// src/App/Handler/One.php
616+
namespace App/Handler;
576617

577-
.. configuration-block::
618+
class One
619+
{
620+
public static function getDefaultPriority(): int
621+
{
622+
return 3;
623+
}
624+
}
578625

579-
.. code-block:: yaml
626+
If you want to have another method defining the priority, can define it in the configuration of the collecting service:
580627

581-
# config/services.yaml
582-
services:
583-
App\Handler\One:
584-
tags:
585-
- { name: 'app.handler', priority: 20 }
628+
.. configuration-block::
586629

587-
.. code-block:: xml
630+
.. code-block:: yaml
588631
589-
<!-- config/services.xml -->
590-
<?xml version="1.0" encoding="UTF-8" ?>
591-
<container xmlns="http://symfony.com/schema/dic/services"
592-
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
593-
xsi:schemaLocation="http://symfony.com/schema/dic/services
594-
https://symfony.com/schema/dic/services/services-1.0.xsd">
632+
# config/services.yaml
633+
services:
634+
App\HandlerCollection:
635+
# inject all services tagged with app.handler as first argument
636+
arguments:
637+
- !tagged_iterator { tag: app.handler, default_priority_method: getPriority }
595638
596-
<services>
597-
<service id="App\Handler\One">
598-
<tag name="app.handler" priority="20"/>
599-
</service>
600-
</services>
601-
</container>
639+
.. code-block:: xml
602640
603-
.. code-block:: php
641+
<!-- config/services.xml -->
642+
<?xml version="1.0" encoding="UTF-8" ?>
643+
<container xmlns="http://symfony.com/schema/dic/services"
644+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
645+
xsi:schemaLocation="http://symfony.com/schema/dic/services
646+
http://symfony.com/schema/dic/services/services-1.0.xsd">
604647
605-
// config/services.php
606-
namespace Symfony\Component\DependencyInjection\Loader\Configurator;
648+
<services>
649+
<service id="App\HandlerCollection">
650+
<argument type="tagged" tag="app.handler" default_priority_method="getPriority"/>
651+
</service>
652+
</services>
653+
</container>
607654
608-
return function(ContainerConfigurator $configurator) {
609-
$services = $configurator->services();
655+
.. code-block:: php
610656
611-
$services->set(App\Handler\One::class)
612-
->tag('app.handler', ['priority' => 20])
613-
;
614-
};
657+
// config/services.php
658+
use Symfony\Component\DependencyInjection\Argument\TaggedIteratorArgument;
615659
616-
Note that any other custom attributes will be ignored by this feature.
660+
$container->register(App\HandlerCollection::class)
661+
->addArgument(new TaggedIteratorArgument('app.handler', null, null, false, 'getPriority'));

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy