-
-
Notifications
You must be signed in to change notification settings - Fork 9.6k
[DependencyInjection] Allow to choose an index for tagged collection #30257
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[DependencyInjection] Allow to choose an index for tagged collection #30257
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Cool, almost ready! Just a few comments to improve tests.
Please see fabbot report also.
src/Symfony/Component/DependencyInjection/Tests/Compiler/IntegrationTest.php
Outdated
Show resolved
Hide resolved
src/Symfony/Component/DependencyInjection/Tests/Compiler/IntegrationTest.php
Outdated
Show resolved
Hide resolved
src/Symfony/Component/DependencyInjection/Tests/Fixtures/includes/bar.php
Outdated
Show resolved
Hide resolved
c84f9b9
to
d18fd9a
Compare
22dfaf3
to
a6ffe83
Compare
(FYI, failures unrelated) |
src/Symfony/Component/DependencyInjection/Argument/TaggedIteratorArgument.php
Show resolved
Hide resolved
src/Symfony/Component/DependencyInjection/Tests/Compiler/IntegrationTest.php
Outdated
Show resolved
Hide resolved
src/Symfony/Component/DependencyInjection/Argument/TaggedIteratorArgument.php
Outdated
Show resolved
Hide resolved
93d55a0
to
ed131b4
Compare
PR to the documentation added |
src/Symfony/Component/DependencyInjection/Argument/TaggedIteratorArgument.php
Outdated
Show resolved
Hide resolved
src/Symfony/Component/DependencyInjection/Compiler/PriorityTaggedServiceTrait.php
Show resolved
Hide resolved
ed131b4
to
d159479
Compare
b28017e
to
e04713f
Compare
Code rebased on master, CI fixed |
e04713f
to
e7d0312
Compare
e7d0312
to
e27a9c1
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
👍 with a minor comment
src/Symfony/Component/DependencyInjection/Loader/YamlFileLoader.php
Outdated
Show resolved
Hide resolved
e27a9c1
to
101bfd7
Compare
Thank you @XuruDragon. |
And thank you @deguif! |
…ged collection (deguif, XuruDragon) This PR was merged into the 4.3-dev branch. Discussion ---------- [DependencyInjection] Allow to choose an index for tagged collection | Q | A | ------------- | --- | Branch? | master | Bug fix? | no | New feature? | yes | BC breaks? | no | Deprecations? | no | Tests pass? | yes | Fixed tickets | #29203 | License | MIT | Doc PR | symfony/symfony-docs#11009 This is the continuity of the PR #29598 Add a way to specify an index based on a tag attribute when injecting a tag collection into services, but also a a way to fallback to a static method on the service class. ```yaml services: foo_service: class: Foo tags: - foo foo_service_tagged: class: Bar arguments: - !tagged tag: 'foo' index_by: 'tag_attribute_name' default_index_method: 'static_method' ``` ```xml <?xml version="1.0" ?> <container xmlns="http://symfony.com/schema/dic/services" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd"> <services> <service id="foo" class="Foo"> <tag name="foo_tag" /> </service> <service id="foo_tagged_iterator" class="Bar" public="true"> <argument type="tagged" tag="foo_tag" index-by="tag_attribute_name" default-index-method="static_method" /> </service> </services> </container> ``` Tasks * [x] Support PHP loader/dumper * [x] Support YAML loader/dumper * [x] Support XML loader/dumper (and update XSD too) * [x] Add tests * [x] Documentation Commits ------- 101bfd7 [DI] change name to tag + add XMl support + adding yaml/xml tests 845d3a6 Allow to choose an index for tagged collection
src/Symfony/Component/DependencyInjection/Argument/TaggedIteratorArgument.php
Show resolved
Hide resolved
src/Symfony/Component/DependencyInjection/Tests/Compiler/IntegrationTest.php
Show resolved
Hide resolved
@stof Thanks! Indeed that's exactly what I need. |
…or service in an injected service locator argument (XuruDragon, nicolas-grekas) This PR was merged into the 4.3-dev branch. Discussion ---------- [DependencyInjection] Add ability to define an index for service in an injected service locator argument | Q | A | ------------- | --- | Branch? | master | Bug fix? | no | New feature? | yes | BC breaks? | no | Deprecations? | no | Tests pass? | yes | Fixed tickets | n/a | License | MIT | Doc PR | in progress / symfony/symfony-docs#... It's more or less the same thing then the PR #30257 but for a service locator argument Add a simple way to specify an index based on a tag attribute to simplify retrieving a specific service when injecting a service locator as argument into services, but also a way to fallback to a static method on the service class. Yaml: ```yaml services: foo_service: class: Foo tags: - {name: foo_tag, key: foo_service} foo_service_tagged: class: Bar arguments: - !tagged_locator tag: 'foo_tag' index_by: 'key' default_index_method: 'static_method' ``` XML: ```xml <?xml version="1.0" ?> <container xmlns="http://symfony.com/schema/dic/services" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd"> <services> <service id="foo" class="Foo"> <tag name="foo_tag" key="foo_service" /> </service> <service id="foo_tagged_iterator" class="Bar" public="true"> <argument type="tagged_locator" tag="foo_tag" index-by="key" default-index-method="static_method" /> </service> </services> </container> ``` PHP: ```php // config/services.php use Symfony\Component\DependencyInjection\Argument\TaggedIteratorArgument; use Symfony\Component\DependencyInjection\Argument\ServiceLocatorArgument; $container->register(Foo::class) ->addTag('foo_tag', ['key' => 'foo_service']); $container->register(App\Handler\HandlerCollection::class) // inject all services tagged with app.handler as first argument ->addArgument(new ServiceLocatorArgument(new TaggedIteratorArgument('app.handler', 'key'))); ``` Usage: ```php // src/Handler/HandlerCollection.php namespace App\Handler; use Symfony\Component\DependencyInjection\ServiceLocator; class HandlerCollection { public function __construct(ServiceLocator $serviceLocator) { $foo = $serviceLocator->get('foo_service'): } } ``` Tasks * [x] Support PHP loader/dumper * [x] Support YAML loader/dumper * [x] Support XML loader/dumper (and update XSD too) * [x] Add tests * [x] Documentation Commits ------- cb3c56b Support indexing tagged locators by FQCN as fallback 250a2c8 [DI] Allow tagged_locator tag to be used as an argument
…or service locators (Anthony MARTIN) This PR was submitted for the master branch but it was merged into the 4.3 branch instead (closes #11042). Discussion ---------- [DependencyInjection] Doc for Allow to choose an index for service locators Here is the doc for the new feature implemented in : [symfony/symfony#30348](symfony/symfony#30348) that follow the feature [symfony/symfony#30257](symfony/symfony#30257) Commits ------- d63c298 [DependencyInjection] Doc for Allow to choose an index for service locator collection
…n index for tagged collection (Anthony MARTIN) This PR was submitted for the master branch but it was merged into the 4.4 branch instead. Discussion ---------- [DependencyInjection] Doc for #30257 Allow to choose an index for tagged collection Here is the doc for the new feature implemented in : symfony/symfony#30257 Commits ------- 980b3d3 [DependencyInjection] Doc for #30257 Allow to choose an index for tagged collection
This is the continuity of the PR #29598
Add a way to specify an index based on a tag attribute when injecting a tag collection into services, but also a a way to fallback to a static method on the service class.
Tasks