diff --git a/src/Symfony/Component/DependencyInjection/Attribute/AutowireLocator.php b/src/Symfony/Component/DependencyInjection/Attribute/AutowireLocator.php new file mode 100644 index 0000000000000..cae2d52a8b1cf --- /dev/null +++ b/src/Symfony/Component/DependencyInjection/Attribute/AutowireLocator.php @@ -0,0 +1,42 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\DependencyInjection\Attribute; + +use Symfony\Component\DependencyInjection\Argument\ServiceLocatorArgument; +use Symfony\Component\DependencyInjection\ContainerInterface; +use Symfony\Component\DependencyInjection\Reference; + +#[\Attribute(\Attribute::TARGET_PARAMETER)] +class AutowireLocator extends Autowire +{ + public function __construct(string ...$serviceIds) + { + $values = []; + + foreach ($serviceIds as $key => $serviceId) { + if ($nullable = str_starts_with($serviceId, '?')) { + $serviceId = substr($serviceId, 1); + } + + if (is_numeric($key)) { + $key = $serviceId; + } + + $values[$key] = new Reference( + $serviceId, + $nullable ? ContainerInterface::IGNORE_ON_INVALID_REFERENCE : ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE, + ); + } + + parent::__construct(new ServiceLocatorArgument($values)); + } +} diff --git a/src/Symfony/Component/DependencyInjection/CHANGELOG.md b/src/Symfony/Component/DependencyInjection/CHANGELOG.md index a44f81101c922..bf03f8c703a04 100644 --- a/src/Symfony/Component/DependencyInjection/CHANGELOG.md +++ b/src/Symfony/Component/DependencyInjection/CHANGELOG.md @@ -7,6 +7,7 @@ CHANGELOG * Allow using `#[Target]` with no arguments to state that a parameter must match a named autowiring alias * Deprecate `ContainerAwareInterface` and `ContainerAwareTrait`, use dependency injection instead * Add `defined` env var processor that returns `true` for defined and neither null nor empty env vars + * Add `#[AutowireLocator]` attribute 6.3 --- diff --git a/src/Symfony/Component/DependencyInjection/Tests/Attribute/AutowireLocatorTest.php b/src/Symfony/Component/DependencyInjection/Tests/Attribute/AutowireLocatorTest.php new file mode 100644 index 0000000000000..50b54ac4a93a9 --- /dev/null +++ b/src/Symfony/Component/DependencyInjection/Tests/Attribute/AutowireLocatorTest.php @@ -0,0 +1,49 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\DependencyInjection\Tests\Attribute; + +use PHPUnit\Framework\TestCase; +use Symfony\Component\DependencyInjection\Argument\ServiceLocatorArgument; +use Symfony\Component\DependencyInjection\Attribute\AutowireLocator; +use Symfony\Component\DependencyInjection\ContainerInterface; +use Symfony\Component\DependencyInjection\Reference; + +class AutowireLocatorTest extends TestCase +{ + public function testSimpleLocator() + { + $locator = new AutowireLocator('foo', 'bar'); + + $this->assertEquals( + new ServiceLocatorArgument(['foo' => new Reference('foo'), 'bar' => new Reference('bar')]), + $locator->value, + ); + } + + public function testComplexLocator() + { + $locator = new AutowireLocator( + '?qux', + foo: 'bar', + bar: '?baz', + ); + + $this->assertEquals( + new ServiceLocatorArgument([ + 'qux' => new Reference('qux', ContainerInterface::IGNORE_ON_INVALID_REFERENCE), + 'foo' => new Reference('bar'), + 'bar' => new Reference('baz', ContainerInterface::IGNORE_ON_INVALID_REFERENCE), + ]), + $locator->value, + ); + } +} diff --git a/src/Symfony/Component/DependencyInjection/Tests/Compiler/IntegrationTest.php b/src/Symfony/Component/DependencyInjection/Tests/Compiler/IntegrationTest.php index 1959724829c71..be51a2b3a5af0 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/Compiler/IntegrationTest.php +++ b/src/Symfony/Component/DependencyInjection/Tests/Compiler/IntegrationTest.php @@ -32,23 +32,24 @@ use Symfony\Component\DependencyInjection\Tests\Fixtures\AutoconfiguredInterface2; use Symfony\Component\DependencyInjection\Tests\Fixtures\AutoconfiguredService1; use Symfony\Component\DependencyInjection\Tests\Fixtures\AutoconfiguredService2; +use Symfony\Component\DependencyInjection\Tests\Fixtures\AutowireLocatorConsumer; use Symfony\Component\DependencyInjection\Tests\Fixtures\BarTagClass; use Symfony\Component\DependencyInjection\Tests\Fixtures\FooBarTaggedClass; use Symfony\Component\DependencyInjection\Tests\Fixtures\FooBarTaggedForDefaultPriorityClass; use Symfony\Component\DependencyInjection\Tests\Fixtures\FooTagClass; -use Symfony\Component\DependencyInjection\Tests\Fixtures\IteratorConsumer; -use Symfony\Component\DependencyInjection\Tests\Fixtures\IteratorConsumerWithDefaultIndexMethod; -use Symfony\Component\DependencyInjection\Tests\Fixtures\IteratorConsumerWithDefaultIndexMethodAndWithDefaultPriorityMethod; -use Symfony\Component\DependencyInjection\Tests\Fixtures\IteratorConsumerWithDefaultPriorityMethod; -use Symfony\Component\DependencyInjection\Tests\Fixtures\LocatorConsumer; -use Symfony\Component\DependencyInjection\Tests\Fixtures\LocatorConsumerConsumer; -use Symfony\Component\DependencyInjection\Tests\Fixtures\LocatorConsumerFactory; -use Symfony\Component\DependencyInjection\Tests\Fixtures\LocatorConsumerWithDefaultIndexMethod; -use Symfony\Component\DependencyInjection\Tests\Fixtures\LocatorConsumerWithDefaultIndexMethodAndWithDefaultPriorityMethod; -use Symfony\Component\DependencyInjection\Tests\Fixtures\LocatorConsumerWithDefaultPriorityMethod; -use Symfony\Component\DependencyInjection\Tests\Fixtures\LocatorConsumerWithoutIndex; use Symfony\Component\DependencyInjection\Tests\Fixtures\StaticMethodTag; use Symfony\Component\DependencyInjection\Tests\Fixtures\TaggedConsumerWithExclude; +use Symfony\Component\DependencyInjection\Tests\Fixtures\TaggedIteratorConsumer; +use Symfony\Component\DependencyInjection\Tests\Fixtures\TaggedIteratorConsumerWithDefaultIndexMethod; +use Symfony\Component\DependencyInjection\Tests\Fixtures\TaggedIteratorConsumerWithDefaultIndexMethodAndWithDefaultPriorityMethod; +use Symfony\Component\DependencyInjection\Tests\Fixtures\TaggedIteratorConsumerWithDefaultPriorityMethod; +use Symfony\Component\DependencyInjection\Tests\Fixtures\TaggedLocatorConsumer; +use Symfony\Component\DependencyInjection\Tests\Fixtures\TaggedLocatorConsumerConsumer; +use Symfony\Component\DependencyInjection\Tests\Fixtures\TaggedLocatorConsumerFactory; +use Symfony\Component\DependencyInjection\Tests\Fixtures\TaggedLocatorConsumerWithDefaultIndexMethod; +use Symfony\Component\DependencyInjection\Tests\Fixtures\TaggedLocatorConsumerWithDefaultIndexMethodAndWithDefaultPriorityMethod; +use Symfony\Component\DependencyInjection\Tests\Fixtures\TaggedLocatorConsumerWithDefaultPriorityMethod; +use Symfony\Component\DependencyInjection\Tests\Fixtures\TaggedLocatorConsumerWithoutIndex; use Symfony\Component\DependencyInjection\Tests\Fixtures\TaggedService1; use Symfony\Component\DependencyInjection\Tests\Fixtures\TaggedService2; use Symfony\Component\DependencyInjection\Tests\Fixtures\TaggedService3; @@ -388,6 +389,30 @@ public function testTaggedServiceWithIndexAttributeAndDefaultMethod() $this->assertSame(['bar_tab_class_with_defaultmethod' => $container->get(BarTagClass::class), 'foo' => $container->get(FooTagClass::class)], $param); } + public function testLocatorConfiguredViaAttribute() + { + $container = new ContainerBuilder(); + $container->register(BarTagClass::class) + ->setPublic(true) + ; + $container->register(FooTagClass::class) + ->setPublic(true) + ; + $container->register(AutowireLocatorConsumer::class) + ->setAutowired(true) + ->setPublic(true) + ; + + $container->compile(); + + /** @var AutowireLocatorConsumer $s */ + $s = $container->get(AutowireLocatorConsumer::class); + + self::assertSame($container->get(BarTagClass::class), $s->locator->get(BarTagClass::class)); + self::assertSame($container->get(FooTagClass::class), $s->locator->get('with_key')); + self::assertFalse($s->locator->has('nullable')); + } + public function testTaggedServiceWithIndexAttributeAndDefaultMethodConfiguredViaAttribute() { $container = new ContainerBuilder(); @@ -399,14 +424,14 @@ public function testTaggedServiceWithIndexAttributeAndDefaultMethodConfiguredVia ->setPublic(true) ->addTag('foo_bar', ['foo' => 'foo']) ; - $container->register(IteratorConsumer::class) + $container->register(TaggedIteratorConsumer::class) ->setAutowired(true) ->setPublic(true) ; $container->compile(); - $s = $container->get(IteratorConsumer::class); + $s = $container->get(TaggedIteratorConsumer::class); $param = iterator_to_array($s->getParam()->getIterator()); $this->assertSame(['bar_tab_class_with_defaultmethod' => $container->get(BarTagClass::class), 'foo' => $container->get(FooTagClass::class)], $param); @@ -423,14 +448,14 @@ public function testTaggedIteratorWithDefaultIndexMethodConfiguredViaAttribute() ->setPublic(true) ->addTag('foo_bar') ; - $container->register(IteratorConsumerWithDefaultIndexMethod::class) + $container->register(TaggedIteratorConsumerWithDefaultIndexMethod::class) ->setAutowired(true) ->setPublic(true) ; $container->compile(); - $s = $container->get(IteratorConsumerWithDefaultIndexMethod::class); + $s = $container->get(TaggedIteratorConsumerWithDefaultIndexMethod::class); $param = iterator_to_array($s->getParam()->getIterator()); $this->assertSame(['bar_tag_class' => $container->get(BarTagClass::class), 'foo_tag_class' => $container->get(FooTagClass::class)], $param); @@ -447,14 +472,14 @@ public function testTaggedIteratorWithDefaultPriorityMethodConfiguredViaAttribut ->setPublic(true) ->addTag('foo_bar') ; - $container->register(IteratorConsumerWithDefaultPriorityMethod::class) + $container->register(TaggedIteratorConsumerWithDefaultPriorityMethod::class) ->setAutowired(true) ->setPublic(true) ; $container->compile(); - $s = $container->get(IteratorConsumerWithDefaultPriorityMethod::class); + $s = $container->get(TaggedIteratorConsumerWithDefaultPriorityMethod::class); $param = iterator_to_array($s->getParam()->getIterator()); $this->assertSame([0 => $container->get(FooTagClass::class), 1 => $container->get(BarTagClass::class)], $param); @@ -471,14 +496,14 @@ public function testTaggedIteratorWithDefaultIndexMethodAndWithDefaultPriorityMe ->setPublic(true) ->addTag('foo_bar') ; - $container->register(IteratorConsumerWithDefaultIndexMethodAndWithDefaultPriorityMethod::class) + $container->register(TaggedIteratorConsumerWithDefaultIndexMethodAndWithDefaultPriorityMethod::class) ->setAutowired(true) ->setPublic(true) ; $container->compile(); - $s = $container->get(IteratorConsumerWithDefaultIndexMethodAndWithDefaultPriorityMethod::class); + $s = $container->get(TaggedIteratorConsumerWithDefaultIndexMethodAndWithDefaultPriorityMethod::class); $param = iterator_to_array($s->getParam()->getIterator()); $this->assertSame(['foo_tag_class' => $container->get(FooTagClass::class), 'bar_tag_class' => $container->get(BarTagClass::class)], $param); @@ -495,15 +520,15 @@ public function testTaggedLocatorConfiguredViaAttribute() ->setPublic(true) ->addTag('foo_bar', ['foo' => 'foo']) ; - $container->register(LocatorConsumer::class) + $container->register(TaggedLocatorConsumer::class) ->setAutowired(true) ->setPublic(true) ; $container->compile(); - /** @var LocatorConsumer $s */ - $s = $container->get(LocatorConsumer::class); + /** @var TaggedLocatorConsumer $s */ + $s = $container->get(TaggedLocatorConsumer::class); $locator = $s->getLocator(); self::assertSame($container->get(BarTagClass::class), $locator->get('bar_tab_class_with_defaultmethod')); @@ -521,15 +546,15 @@ public function testTaggedLocatorConfiguredViaAttributeWithoutIndex() ->setPublic(true) ->addTag('foo_bar') ; - $container->register(LocatorConsumerWithoutIndex::class) + $container->register(TaggedLocatorConsumerWithoutIndex::class) ->setAutowired(true) ->setPublic(true) ; $container->compile(); - /** @var LocatorConsumerWithoutIndex $s */ - $s = $container->get(LocatorConsumerWithoutIndex::class); + /** @var TaggedLocatorConsumerWithoutIndex $s */ + $s = $container->get(TaggedLocatorConsumerWithoutIndex::class); $locator = $s->getLocator(); self::assertSame($container->get(BarTagClass::class), $locator->get(BarTagClass::class)); @@ -547,15 +572,15 @@ public function testTaggedLocatorWithDefaultIndexMethodConfiguredViaAttribute() ->setPublic(true) ->addTag('foo_bar') ; - $container->register(LocatorConsumerWithDefaultIndexMethod::class) + $container->register(TaggedLocatorConsumerWithDefaultIndexMethod::class) ->setAutowired(true) ->setPublic(true) ; $container->compile(); - /** @var LocatorConsumerWithoutIndex $s */ - $s = $container->get(LocatorConsumerWithDefaultIndexMethod::class); + /** @var TaggedLocatorConsumerWithoutIndex $s */ + $s = $container->get(TaggedLocatorConsumerWithDefaultIndexMethod::class); $locator = $s->getLocator(); self::assertSame($container->get(BarTagClass::class), $locator->get('bar_tag_class')); @@ -573,15 +598,15 @@ public function testTaggedLocatorWithDefaultPriorityMethodConfiguredViaAttribute ->setPublic(true) ->addTag('foo_bar') ; - $container->register(LocatorConsumerWithDefaultPriorityMethod::class) + $container->register(TaggedLocatorConsumerWithDefaultPriorityMethod::class) ->setAutowired(true) ->setPublic(true) ; $container->compile(); - /** @var LocatorConsumerWithoutIndex $s */ - $s = $container->get(LocatorConsumerWithDefaultPriorityMethod::class); + /** @var TaggedLocatorConsumerWithoutIndex $s */ + $s = $container->get(TaggedLocatorConsumerWithDefaultPriorityMethod::class); $locator = $s->getLocator(); @@ -602,15 +627,15 @@ public function testTaggedLocatorWithDefaultIndexMethodAndWithDefaultPriorityMet ->setPublic(true) ->addTag('foo_bar') ; - $container->register(LocatorConsumerWithDefaultIndexMethodAndWithDefaultPriorityMethod::class) + $container->register(TaggedLocatorConsumerWithDefaultIndexMethodAndWithDefaultPriorityMethod::class) ->setAutowired(true) ->setPublic(true) ; $container->compile(); - /** @var LocatorConsumerWithoutIndex $s */ - $s = $container->get(LocatorConsumerWithDefaultIndexMethodAndWithDefaultPriorityMethod::class); + /** @var TaggedLocatorConsumerWithoutIndex $s */ + $s = $container->get(TaggedLocatorConsumerWithDefaultIndexMethodAndWithDefaultPriorityMethod::class); $locator = $s->getLocator(); @@ -629,18 +654,18 @@ public function testNestedDefinitionWithAutoconfiguredConstructorArgument() ->setPublic(true) ->addTag('foo_bar', ['foo' => 'foo']) ; - $container->register(LocatorConsumerConsumer::class) + $container->register(TaggedLocatorConsumerConsumer::class) ->setPublic(true) ->setArguments([ - (new Definition(LocatorConsumer::class)) + (new Definition(TaggedLocatorConsumer::class)) ->setAutowired(true), ]) ; $container->compile(); - /** @var LocatorConsumerConsumer $s */ - $s = $container->get(LocatorConsumerConsumer::class); + /** @var TaggedLocatorConsumerConsumer $s */ + $s = $container->get(TaggedLocatorConsumerConsumer::class); $locator = $s->getLocatorConsumer()->getLocator(); self::assertSame($container->get(FooTagClass::class), $locator->get('foo')); @@ -653,17 +678,17 @@ public function testFactoryWithAutoconfiguredArgument() ->setPublic(true) ->addTag('foo_bar', ['key' => 'my_service']) ; - $container->register(LocatorConsumerFactory::class); - $container->register(LocatorConsumer::class) + $container->register(TaggedLocatorConsumerFactory::class); + $container->register(TaggedLocatorConsumer::class) ->setPublic(true) ->setAutowired(true) - ->setFactory(new Reference(LocatorConsumerFactory::class)) + ->setFactory(new Reference(TaggedLocatorConsumerFactory::class)) ; $container->compile(); - /** @var LocatorConsumer $s */ - $s = $container->get(LocatorConsumer::class); + /** @var TaggedLocatorConsumer $s */ + $s = $container->get(TaggedLocatorConsumer::class); $locator = $s->getLocator(); self::assertSame($container->get(FooTagClass::class), $locator->get('my_service')); diff --git a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/AutowireLocatorConsumer.php b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/AutowireLocatorConsumer.php new file mode 100644 index 0000000000000..ec65075def77c --- /dev/null +++ b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/AutowireLocatorConsumer.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\DependencyInjection\Tests\Fixtures; + +use Psr\Container\ContainerInterface; +use Symfony\Component\DependencyInjection\Attribute\AutowireLocator; + +final class AutowireLocatorConsumer +{ + public function __construct( + #[AutowireLocator( + BarTagClass::class, + with_key: FooTagClass::class, + nullable: '?invalid', + )] + public readonly ContainerInterface $locator, + ) { + } +} diff --git a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/IteratorConsumer.php b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/TaggedIteratorConsumer.php similarity index 94% rename from src/Symfony/Component/DependencyInjection/Tests/Fixtures/IteratorConsumer.php rename to src/Symfony/Component/DependencyInjection/Tests/Fixtures/TaggedIteratorConsumer.php index 329a14f39331d..1f9c98d8e6b96 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/IteratorConsumer.php +++ b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/TaggedIteratorConsumer.php @@ -13,7 +13,7 @@ use Symfony\Component\DependencyInjection\Attribute\TaggedIterator; -final class IteratorConsumer +final class TaggedIteratorConsumer { public function __construct( #[TaggedIterator('foo_bar', indexAttribute: 'foo')] diff --git a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/IteratorConsumerWithDefaultIndexMethod.php b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/TaggedIteratorConsumerWithDefaultIndexMethod.php similarity index 87% rename from src/Symfony/Component/DependencyInjection/Tests/Fixtures/IteratorConsumerWithDefaultIndexMethod.php rename to src/Symfony/Component/DependencyInjection/Tests/Fixtures/TaggedIteratorConsumerWithDefaultIndexMethod.php index 9344b575eea79..9e5b279e13396 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/IteratorConsumerWithDefaultIndexMethod.php +++ b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/TaggedIteratorConsumerWithDefaultIndexMethod.php @@ -4,7 +4,7 @@ use Symfony\Component\DependencyInjection\Attribute\TaggedIterator; -final class IteratorConsumerWithDefaultIndexMethod +final class TaggedIteratorConsumerWithDefaultIndexMethod { public function __construct( #[TaggedIterator(tag: 'foo_bar', defaultIndexMethod: 'getDefaultFooName')] diff --git a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/IteratorConsumerWithDefaultIndexMethodAndWithDefaultPriorityMethod.php b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/TaggedIteratorConsumerWithDefaultIndexMethodAndWithDefaultPriorityMethod.php similarity index 83% rename from src/Symfony/Component/DependencyInjection/Tests/Fixtures/IteratorConsumerWithDefaultIndexMethodAndWithDefaultPriorityMethod.php rename to src/Symfony/Component/DependencyInjection/Tests/Fixtures/TaggedIteratorConsumerWithDefaultIndexMethodAndWithDefaultPriorityMethod.php index f0fd6f68eb72b..e614931e9fb5b 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/IteratorConsumerWithDefaultIndexMethodAndWithDefaultPriorityMethod.php +++ b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/TaggedIteratorConsumerWithDefaultIndexMethodAndWithDefaultPriorityMethod.php @@ -4,7 +4,7 @@ use Symfony\Component\DependencyInjection\Attribute\TaggedIterator; -final class IteratorConsumerWithDefaultIndexMethodAndWithDefaultPriorityMethod +final class TaggedIteratorConsumerWithDefaultIndexMethodAndWithDefaultPriorityMethod { public function __construct( #[TaggedIterator(tag: 'foo_bar', defaultIndexMethod: 'getDefaultFooName', defaultPriorityMethod: 'getPriority')] diff --git a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/IteratorConsumerWithDefaultPriorityMethod.php b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/TaggedIteratorConsumerWithDefaultPriorityMethod.php similarity index 86% rename from src/Symfony/Component/DependencyInjection/Tests/Fixtures/IteratorConsumerWithDefaultPriorityMethod.php rename to src/Symfony/Component/DependencyInjection/Tests/Fixtures/TaggedIteratorConsumerWithDefaultPriorityMethod.php index fe78f9c6d0b61..faa544b1a6d25 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/IteratorConsumerWithDefaultPriorityMethod.php +++ b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/TaggedIteratorConsumerWithDefaultPriorityMethod.php @@ -4,7 +4,7 @@ use Symfony\Component\DependencyInjection\Attribute\TaggedIterator; -final class IteratorConsumerWithDefaultPriorityMethod +final class TaggedIteratorConsumerWithDefaultPriorityMethod { public function __construct( #[TaggedIterator(tag: 'foo_bar', defaultPriorityMethod: 'getPriority')] diff --git a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/LocatorConsumer.php b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/TaggedLocatorConsumer.php similarity index 95% rename from src/Symfony/Component/DependencyInjection/Tests/Fixtures/LocatorConsumer.php rename to src/Symfony/Component/DependencyInjection/Tests/Fixtures/TaggedLocatorConsumer.php index 487cce16c0da8..672389dae8481 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/LocatorConsumer.php +++ b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/TaggedLocatorConsumer.php @@ -14,7 +14,7 @@ use Psr\Container\ContainerInterface; use Symfony\Component\DependencyInjection\Attribute\TaggedLocator; -final class LocatorConsumer +final class TaggedLocatorConsumer { public function __construct( #[TaggedLocator('foo_bar', indexAttribute: 'foo')] diff --git a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/LocatorConsumerConsumer.php b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/TaggedLocatorConsumerConsumer.php similarity index 71% rename from src/Symfony/Component/DependencyInjection/Tests/Fixtures/LocatorConsumerConsumer.php rename to src/Symfony/Component/DependencyInjection/Tests/Fixtures/TaggedLocatorConsumerConsumer.php index c686754c5ad7e..c40e134a3e8f3 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/LocatorConsumerConsumer.php +++ b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/TaggedLocatorConsumerConsumer.php @@ -11,14 +11,14 @@ namespace Symfony\Component\DependencyInjection\Tests\Fixtures; -final class LocatorConsumerConsumer +final class TaggedLocatorConsumerConsumer { public function __construct( - private LocatorConsumer $locatorConsumer + private TaggedLocatorConsumer $locatorConsumer ) { } - public function getLocatorConsumer(): LocatorConsumer + public function getLocatorConsumer(): TaggedLocatorConsumer { return $this->locatorConsumer; } diff --git a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/LocatorConsumerFactory.php b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/TaggedLocatorConsumerFactory.php similarity index 81% rename from src/Symfony/Component/DependencyInjection/Tests/Fixtures/LocatorConsumerFactory.php rename to src/Symfony/Component/DependencyInjection/Tests/Fixtures/TaggedLocatorConsumerFactory.php index 4783e0cb609a2..fcdfe489cb7d3 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/LocatorConsumerFactory.php +++ b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/TaggedLocatorConsumerFactory.php @@ -14,12 +14,12 @@ use Psr\Container\ContainerInterface; use Symfony\Component\DependencyInjection\Attribute\TaggedLocator; -final class LocatorConsumerFactory +final class TaggedLocatorConsumerFactory { public function __invoke( #[TaggedLocator('foo_bar', indexAttribute: 'key')] ContainerInterface $locator - ): LocatorConsumer { - return new LocatorConsumer($locator); + ): TaggedLocatorConsumer { + return new TaggedLocatorConsumer($locator); } } diff --git a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/LocatorConsumerWithDefaultIndexMethod.php b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/TaggedLocatorConsumerWithDefaultIndexMethod.php similarity index 88% rename from src/Symfony/Component/DependencyInjection/Tests/Fixtures/LocatorConsumerWithDefaultIndexMethod.php rename to src/Symfony/Component/DependencyInjection/Tests/Fixtures/TaggedLocatorConsumerWithDefaultIndexMethod.php index 6519e4393a68e..be7e0ae24ccab 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/LocatorConsumerWithDefaultIndexMethod.php +++ b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/TaggedLocatorConsumerWithDefaultIndexMethod.php @@ -5,7 +5,7 @@ use Psr\Container\ContainerInterface; use Symfony\Component\DependencyInjection\Attribute\TaggedLocator; -final class LocatorConsumerWithDefaultIndexMethod +final class TaggedLocatorConsumerWithDefaultIndexMethod { public function __construct( #[TaggedLocator(tag: 'foo_bar', defaultIndexMethod: 'getDefaultFooName')] diff --git a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/LocatorConsumerWithDefaultIndexMethodAndWithDefaultPriorityMethod.php b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/TaggedLocatorConsumerWithDefaultIndexMethodAndWithDefaultPriorityMethod.php similarity index 85% rename from src/Symfony/Component/DependencyInjection/Tests/Fixtures/LocatorConsumerWithDefaultIndexMethodAndWithDefaultPriorityMethod.php rename to src/Symfony/Component/DependencyInjection/Tests/Fixtures/TaggedLocatorConsumerWithDefaultIndexMethodAndWithDefaultPriorityMethod.php index f809a8b36ca55..0306b920fa9cf 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/LocatorConsumerWithDefaultIndexMethodAndWithDefaultPriorityMethod.php +++ b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/TaggedLocatorConsumerWithDefaultIndexMethodAndWithDefaultPriorityMethod.php @@ -5,7 +5,7 @@ use Psr\Container\ContainerInterface; use Symfony\Component\DependencyInjection\Attribute\TaggedLocator; -final class LocatorConsumerWithDefaultIndexMethodAndWithDefaultPriorityMethod +final class TaggedLocatorConsumerWithDefaultIndexMethodAndWithDefaultPriorityMethod { public function __construct( #[TaggedLocator(tag: 'foo_bar', defaultIndexMethod: 'getDefaultFooName', defaultPriorityMethod: 'getPriority')] diff --git a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/LocatorConsumerWithDefaultPriorityMethod.php b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/TaggedLocatorConsumerWithDefaultPriorityMethod.php similarity index 88% rename from src/Symfony/Component/DependencyInjection/Tests/Fixtures/LocatorConsumerWithDefaultPriorityMethod.php rename to src/Symfony/Component/DependencyInjection/Tests/Fixtures/TaggedLocatorConsumerWithDefaultPriorityMethod.php index 0fedc2b268089..8904c8a3ecfcf 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/LocatorConsumerWithDefaultPriorityMethod.php +++ b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/TaggedLocatorConsumerWithDefaultPriorityMethod.php @@ -5,7 +5,7 @@ use Psr\Container\ContainerInterface; use Symfony\Component\DependencyInjection\Attribute\TaggedLocator; -final class LocatorConsumerWithDefaultPriorityMethod +final class TaggedLocatorConsumerWithDefaultPriorityMethod { public function __construct( #[TaggedLocator(tag: 'foo_bar', defaultPriorityMethod: 'getPriority')] diff --git a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/LocatorConsumerWithoutIndex.php b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/TaggedLocatorConsumerWithoutIndex.php similarity index 93% rename from src/Symfony/Component/DependencyInjection/Tests/Fixtures/LocatorConsumerWithoutIndex.php rename to src/Symfony/Component/DependencyInjection/Tests/Fixtures/TaggedLocatorConsumerWithoutIndex.php index 74b81659527ca..58ea5d8953a33 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/LocatorConsumerWithoutIndex.php +++ b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/TaggedLocatorConsumerWithoutIndex.php @@ -14,7 +14,7 @@ use Psr\Container\ContainerInterface; use Symfony\Component\DependencyInjection\Attribute\TaggedLocator; -final class LocatorConsumerWithoutIndex +final class TaggedLocatorConsumerWithoutIndex { public function __construct( #[TaggedLocator('foo_bar')] diff --git a/src/Symfony/Component/HttpKernel/Tests/DependencyInjection/RegisterControllerArgumentLocatorsPassTest.php b/src/Symfony/Component/HttpKernel/Tests/DependencyInjection/RegisterControllerArgumentLocatorsPassTest.php index 1a074eb1162f7..584a13f6f5e9c 100644 --- a/src/Symfony/Component/HttpKernel/Tests/DependencyInjection/RegisterControllerArgumentLocatorsPassTest.php +++ b/src/Symfony/Component/HttpKernel/Tests/DependencyInjection/RegisterControllerArgumentLocatorsPassTest.php @@ -17,6 +17,7 @@ use Symfony\Component\DependencyInjection\Argument\ServiceClosureArgument; use Symfony\Component\DependencyInjection\Attribute\Autowire; use Symfony\Component\DependencyInjection\Attribute\AutowireCallable; +use Symfony\Component\DependencyInjection\Attribute\AutowireLocator; use Symfony\Component\DependencyInjection\Attribute\TaggedIterator; use Symfony\Component\DependencyInjection\Attribute\TaggedLocator; use Symfony\Component\DependencyInjection\Attribute\Target; @@ -516,7 +517,7 @@ public function testTaggedIteratorAndTaggedLocatorAttributes() /** @var ServiceLocator $locator */ $locator = $container->get($locatorId)->get('foo::fooAction'); - $this->assertCount(2, $locator->getProvidedServices()); + $this->assertCount(3, $locator->getProvidedServices()); $this->assertTrue($locator->has('iterator')); $this->assertInstanceOf(RewindableGenerator::class, $argIterator = $locator->get('iterator')); @@ -529,6 +530,12 @@ public function testTaggedIteratorAndTaggedLocatorAttributes() $this->assertTrue($argLocator->has('baz')); $this->assertSame(iterator_to_array($argIterator), [$argLocator->get('bar'), $argLocator->get('baz')]); + + $this->assertTrue($locator->has('container')); + $this->assertInstanceOf(ServiceLocator::class, $argLocator = $locator->get('container')); + $this->assertCount(2, $argLocator); + $this->assertTrue($argLocator->has('bar')); + $this->assertTrue($argLocator->has('baz')); } } @@ -669,6 +676,7 @@ class WithTaggedIteratorAndTaggedLocator public function fooAction( #[TaggedIterator('foobar')] iterable $iterator, #[TaggedLocator('foobar')] ServiceLocator $locator, + #[AutowireLocator('bar', 'baz')] ContainerInterface $container, ) { } } diff --git a/src/Symfony/Component/HttpKernel/composer.json b/src/Symfony/Component/HttpKernel/composer.json index 370e92ef72f41..eeb79c091807e 100644 --- a/src/Symfony/Component/HttpKernel/composer.json +++ b/src/Symfony/Component/HttpKernel/composer.json @@ -30,7 +30,7 @@ "symfony/config": "^6.1|^7.0", "symfony/console": "^5.4|^6.0|^7.0", "symfony/css-selector": "^5.4|^6.0|^7.0", - "symfony/dependency-injection": "^6.3.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", "symfony/dom-crawler": "^5.4|^6.0|^7.0", "symfony/expression-language": "^5.4|^6.0|^7.0", "symfony/finder": "^5.4|^6.0|^7.0", @@ -57,7 +57,7 @@ "symfony/config": "<6.1", "symfony/console": "<5.4", "symfony/form": "<5.4", - "symfony/dependency-injection": "<6.3.4", + "symfony/dependency-injection": "<6.4", "symfony/doctrine-bridge": "<5.4", "symfony/http-client": "<5.4", "symfony/http-client-contracts": "<2.5", 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