Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 65d3a3a

Browse files
committed
Deprecate #[TaggedIterator] and #[TaggedLocator]
1 parent 759b6e1 commit 65d3a3a

File tree

8 files changed

+115
-22
lines changed

8 files changed

+115
-22
lines changed

UPGRADE-7.1.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,11 @@ Cache
1111

1212
* Deprecate `CouchbaseBucketAdapter`, use `CouchbaseCollectionAdapter` instead
1313

14+
DependencyInjection
15+
-------------------
16+
17+
* Deprecate `#[TaggedIterator]` and `#[TaggedLocator]` attributes, use `#[AutowireIterator]` and `#[AutowireLocator]` instead
18+
1419
ExpressionLanguage
1520
------------------
1621

src/Symfony/Component/DependencyInjection/Attribute/TaggedIterator.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313

1414
/**
1515
* Autowires an iterator of services based on a tag name.
16+
*
17+
* @deprecated since 7.1, use {@see AutowireIterator} instead.
1618
*/
1719
#[\Attribute(\Attribute::TARGET_PARAMETER)]
1820
class TaggedIterator extends AutowireIterator
@@ -33,6 +35,8 @@ public function __construct(
3335
public string|array $exclude = [],
3436
public bool $excludeSelf = true,
3537
) {
38+
trigger_deprecation('symfony/dependency-injection', '7.1', 'The "%s" attribute is deprecated, use "%s" instead.', self::class, AutowireIterator::class);
39+
3640
parent::__construct($tag, $indexAttribute, $defaultIndexMethod, $defaultPriorityMethod, $exclude, $excludeSelf);
3741
}
3842
}

src/Symfony/Component/DependencyInjection/Attribute/TaggedLocator.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313

1414
/**
1515
* Autowires a locator of services based on a tag name.
16+
*
17+
* @deprecated since 7.1, use {@see AutowireLocator} instead.
1618
*/
1719
#[\Attribute(\Attribute::TARGET_PARAMETER)]
1820
class TaggedLocator extends AutowireLocator
@@ -33,6 +35,8 @@ public function __construct(
3335
public string|array $exclude = [],
3436
public bool $excludeSelf = true,
3537
) {
38+
trigger_deprecation('symfony/dependency-injection', '7.1', 'The "%s" attribute is deprecated, use "%s" instead.', self::class, AutowireLocator::class);
39+
3640
parent::__construct($tag, $indexAttribute, $defaultIndexMethod, $defaultPriorityMethod, $exclude, $excludeSelf);
3741
}
3842
}

src/Symfony/Component/DependencyInjection/Tests/Compiler/IntegrationTest.php

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -447,6 +447,7 @@ public function testTaggedServiceWithIndexAttributeAndDefaultMethodConfiguredVia
447447
$this->assertSame(['bar_tab_class_with_defaultmethod' => $container->get(BarTagClass::class), 'foo' => $container->get(FooTagClass::class)], $param);
448448
}
449449

450+
/** @group legacy */
450451
public function testTaggedIteratorWithDefaultIndexMethodConfiguredViaAttribute()
451452
{
452453
$container = new ContainerBuilder();
@@ -471,6 +472,7 @@ public function testTaggedIteratorWithDefaultIndexMethodConfiguredViaAttribute()
471472
$this->assertSame(['bar_tag_class' => $container->get(BarTagClass::class), 'foo_tag_class' => $container->get(FooTagClass::class)], $param);
472473
}
473474

475+
/** @group legacy */
474476
public function testTaggedIteratorWithDefaultPriorityMethodConfiguredViaAttribute()
475477
{
476478
$container = new ContainerBuilder();
@@ -495,6 +497,7 @@ public function testTaggedIteratorWithDefaultPriorityMethodConfiguredViaAttribut
495497
$this->assertSame([0 => $container->get(FooTagClass::class), 1 => $container->get(BarTagClass::class)], $param);
496498
}
497499

500+
/** @group legacy */
498501
public function testTaggedIteratorWithDefaultIndexMethodAndWithDefaultPriorityMethodConfiguredViaAttribute()
499502
{
500503
$container = new ContainerBuilder();
@@ -545,6 +548,7 @@ public function testTaggedLocatorConfiguredViaAttribute()
545548
self::assertSame($container->get(FooTagClass::class), $locator->get('foo'));
546549
}
547550

551+
/** @group legacy */
548552
public function testTaggedLocatorConfiguredViaAttributeWithoutIndex()
549553
{
550554
$container = new ContainerBuilder();
@@ -571,6 +575,7 @@ public function testTaggedLocatorConfiguredViaAttributeWithoutIndex()
571575
self::assertSame($container->get(FooTagClass::class), $locator->get(FooTagClass::class));
572576
}
573577

578+
/** @group legacy */
574579
public function testTaggedLocatorWithDefaultIndexMethodConfiguredViaAttribute()
575580
{
576581
$container = new ContainerBuilder();
@@ -597,6 +602,7 @@ public function testTaggedLocatorWithDefaultIndexMethodConfiguredViaAttribute()
597602
self::assertSame($container->get(FooTagClass::class), $locator->get('foo_tag_class'));
598603
}
599604

605+
/** @group legacy */
600606
public function testTaggedLocatorWithDefaultPriorityMethodConfiguredViaAttribute()
601607
{
602608
$container = new ContainerBuilder();
@@ -626,6 +632,7 @@ public function testTaggedLocatorWithDefaultPriorityMethodConfiguredViaAttribute
626632
self::assertSame([BarTagClass::class, FooTagClass::class], array_keys($factories->getValue($locator)));
627633
}
628634

635+
/** @group legacy */
629636
public function testTaggedLocatorWithDefaultIndexMethodAndWithDefaultPriorityMethodConfiguredViaAttribute()
630637
{
631638
$container = new ContainerBuilder();
@@ -681,6 +688,7 @@ public function testNestedDefinitionWithAutoconfiguredConstructorArgument()
681688
self::assertSame($container->get(FooTagClass::class), $locator->get('foo'));
682689
}
683690

691+
/** @group legacy */
684692
public function testFactoryWithAutoconfiguredArgument()
685693
{
686694
$container = new ContainerBuilder();
@@ -1083,6 +1091,7 @@ static function (ChildDefinition $d, CustomMethodAttribute $a, \ReflectionMethod
10831091
$container->get('service');
10841092
}
10851093

1094+
/** @group legacy */
10861095
public function testTaggedIteratorAndLocatorWithExclude()
10871096
{
10881097
$container = new ContainerBuilder();

src/Symfony/Component/DependencyInjection/Tests/Compiler/RegisterServiceSubscribersPassTest.php

Lines changed: 45 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -421,8 +421,6 @@ public function testSubscribedServiceWithAttributes()
421421
public static function getSubscribedServices(): array
422422
{
423423
return [
424-
new SubscribedService('tagged.iterator', 'iterable', attributes: new TaggedIterator('tag')),
425-
new SubscribedService('tagged.locator', PsrContainerInterface::class, attributes: new TaggedLocator('tag')),
426424
new SubscribedService('autowired', 'stdClass', attributes: new Autowire(service: 'service.id')),
427425
new SubscribedService('autowired.nullable', 'stdClass', nullable: true, attributes: new Autowire(service: 'service.id')),
428426
new SubscribedService('autowired.parameter', 'string', attributes: new Autowire('%parameter.1%')),
@@ -444,8 +442,6 @@ public static function getSubscribedServices(): array
444442
$locator = $container->getDefinition((string) $foo->getMethodCalls()[0][1][0]);
445443

446444
$expected = [
447-
'tagged.iterator' => new ServiceClosureArgument(new TypedReference('iterable', 'iterable', ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE, 'tagged.iterator', [new TaggedIterator('tag')])),
448-
'tagged.locator' => new ServiceClosureArgument(new TypedReference(PsrContainerInterface::class, PsrContainerInterface::class, ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE, 'tagged.locator', [new TaggedLocator('tag')])),
449445
'autowired' => new ServiceClosureArgument(new TypedReference('stdClass', 'stdClass', ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE, 'autowired', [new Autowire(service: 'service.id')])),
450446
'autowired.nullable' => new ServiceClosureArgument(new TypedReference('stdClass', 'stdClass', ContainerInterface::IGNORE_ON_INVALID_REFERENCE, 'autowired.nullable', [new Autowire(service: 'service.id')])),
451447
'autowired.parameter' => new ServiceClosureArgument(new TypedReference('string', 'string', ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE, 'autowired.parameter', [new Autowire(service: '%parameter.1%')])),
@@ -457,17 +453,59 @@ public static function getSubscribedServices(): array
457453
(new AutowirePass())->process($container);
458454

459455
$expected = [
460-
'tagged.iterator' => new ServiceClosureArgument(new TaggedIteratorArgument('tag')),
461-
'tagged.locator' => new ServiceClosureArgument(new ServiceLocatorArgument(new TaggedIteratorArgument('tag', 'tag', needsIndexes: true))),
462456
'autowired' => new ServiceClosureArgument(new TypedReference('service.id', 'stdClass', ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE, 'autowired', [new Autowire(service: 'service.id')])),
463457
'autowired.nullable' => new ServiceClosureArgument(new TypedReference('service.id', 'stdClass', ContainerInterface::IGNORE_ON_INVALID_REFERENCE, 'autowired.nullable', [new Autowire(service: 'service.id')])),
464458
'autowired.parameter' => new ServiceClosureArgument('foobar'),
465-
'autowire.decorated' => new ServiceClosureArgument(new Reference('.service_locator.420ES7z.inner', ContainerInterface::NULL_ON_INVALID_REFERENCE)),
459+
'autowire.decorated' => new ServiceClosureArgument(new Reference('.service_locator.4qmCWv..inner', ContainerInterface::NULL_ON_INVALID_REFERENCE)),
466460
'target' => new ServiceClosureArgument(new TypedReference('stdClass', 'stdClass', ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE, 'target', [new Target('someTarget')])),
467461
];
468462
$this->assertEquals($expected, $container->getDefinition((string) $locator->getFactory()[0])->getArgument(0));
469463
}
470464

465+
public function testLegacySubscribedServiceWithAttributes()
466+
{
467+
if (!property_exists(SubscribedService::class, 'attributes')) {
468+
$this->markTestSkipped('Requires symfony/service-contracts 3.2+');
469+
}
470+
471+
$container = new ContainerBuilder();
472+
473+
$subscriber = new class() implements ServiceSubscriberInterface {
474+
public static function getSubscribedServices(): array
475+
{
476+
return [
477+
new SubscribedService('tagged.iterator', 'iterable', attributes: new TaggedIterator('tag')),
478+
new SubscribedService('tagged.locator', PsrContainerInterface::class, attributes: new TaggedLocator('tag')),
479+
];
480+
}
481+
};
482+
483+
$container->setParameter('parameter.1', 'foobar');
484+
$container->register('foo', $subscriber::class)
485+
->addMethodCall('setContainer', [new Reference(PsrContainerInterface::class)])
486+
->addTag('container.service_subscriber');
487+
488+
(new RegisterServiceSubscribersPass())->process($container);
489+
(new ResolveServiceSubscribersPass())->process($container);
490+
491+
$foo = $container->getDefinition('foo');
492+
$locator = $container->getDefinition((string) $foo->getMethodCalls()[0][1][0]);
493+
494+
$expected = [
495+
'tagged.iterator' => new ServiceClosureArgument(new TypedReference('iterable', 'iterable', ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE, 'tagged.iterator', [new TaggedIterator('tag')])),
496+
'tagged.locator' => new ServiceClosureArgument(new TypedReference(PsrContainerInterface::class, PsrContainerInterface::class, ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE, 'tagged.locator', [new TaggedLocator('tag')])),
497+
];
498+
$this->assertEquals($expected, $container->getDefinition((string) $locator->getFactory()[0])->getArgument(0));
499+
500+
(new AutowirePass())->process($container);
501+
502+
$expected = [
503+
'tagged.iterator' => new ServiceClosureArgument(new TaggedIteratorArgument('tag')),
504+
'tagged.locator' => new ServiceClosureArgument(new ServiceLocatorArgument(new TaggedIteratorArgument('tag', 'tag', needsIndexes: true))),
505+
];
506+
$this->assertEquals($expected, $container->getDefinition((string) $locator->getFactory()[0])->getArgument(0));
507+
}
508+
471509
public function testBinding()
472510
{
473511
$container = new ContainerBuilder();

src/Symfony/Component/DependencyInjection/Tests/Fixtures/TaggedLocatorConsumerWithServiceSubscriber.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
namespace Symfony\Component\DependencyInjection\Tests\Fixtures;
1313

1414
use Psr\Container\ContainerInterface;
15-
use Symfony\Component\DependencyInjection\Attribute\TaggedLocator;
15+
use Symfony\Component\DependencyInjection\Attribute\AutowireLocator;
1616
use Symfony\Contracts\Service\Attribute\Required;
1717
use Symfony\Contracts\Service\ServiceSubscriberInterface;
1818

@@ -21,7 +21,7 @@ final class TaggedLocatorConsumerWithServiceSubscriber implements ServiceSubscri
2121
private ?ContainerInterface $container = null;
2222

2323
public function __construct(
24-
#[TaggedLocator('foo_bar', indexAttribute: 'key')]
24+
#[AutowireLocator('foo_bar', indexAttribute: 'key')]
2525
private ContainerInterface $locator,
2626
) {
2727
}

src/Symfony/Component/DependencyInjection/Tests/Fixtures/includes/autowiring_classes_80.php

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@
55
use Symfony\Component\DependencyInjection\Attribute\AsDecorator;
66
use Symfony\Component\DependencyInjection\Attribute\Autowire;
77
use Symfony\Component\DependencyInjection\Attribute\AutowireDecorated;
8+
use Symfony\Component\DependencyInjection\Attribute\AutowireIterator;
9+
use Symfony\Component\DependencyInjection\Attribute\AutowireLocator;
810
use Symfony\Component\DependencyInjection\Attribute\Lazy;
9-
use Symfony\Component\DependencyInjection\Attribute\TaggedIterator;
10-
use Symfony\Component\DependencyInjection\Attribute\TaggedLocator;
1111
use Symfony\Component\DependencyInjection\ContainerInterface;
1212
use Symfony\Contracts\Service\Attribute\Required;
1313

@@ -119,8 +119,8 @@ class AutowireNestedAttributes implements AsDecoratorInterface
119119
public function __construct(
120120
#[Autowire([
121121
'decorated' => new AutowireDecorated(),
122-
'iterator' => new TaggedIterator('foo'),
123-
'locator' => new TaggedLocator('foo'),
122+
'iterator' => new AutowireIterator('foo'),
123+
'locator' => new AutowireLocator('foo'),
124124
'service' => new Autowire(service: 'bar')
125125
])] array $options)
126126
{

src/Symfony/Component/HttpKernel/Tests/DependencyInjection/RegisterControllerArgumentLocatorsPassTest.php

Lines changed: 42 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -502,6 +502,7 @@ public function testAutowireAttribute()
502502
$this->assertFalse($locator->has('service2'));
503503
}
504504

505+
/** @group legacy */
505506
public function testTaggedIteratorAndTaggedLocatorAttributes()
506507
{
507508
$container = new ContainerBuilder();
@@ -524,26 +525,51 @@ public function testTaggedIteratorAndTaggedLocatorAttributes()
524525
/** @var ServiceLocator $locator */
525526
$locator = $container->get($locatorId)->get('foo::fooAction');
526527

527-
$this->assertCount(6, $locator->getProvidedServices());
528+
$this->assertCount(2, $locator->getProvidedServices());
528529

529530
$this->assertTrue($locator->has('iterator1'));
530531
$this->assertInstanceOf(RewindableGenerator::class, $argIterator = $locator->get('iterator1'));
531532
$this->assertCount(2, $argIterator);
532533

533-
$this->assertTrue($locator->has('iterator2'));
534-
$this->assertInstanceOf(RewindableGenerator::class, $argIterator = $locator->get('iterator2'));
535-
$this->assertCount(2, $argIterator);
536-
537534
$this->assertTrue($locator->has('locator1'));
538535
$this->assertInstanceOf(ServiceLocator::class, $argLocator = $locator->get('locator1'));
539536
$this->assertCount(2, $argLocator);
540537
$this->assertTrue($argLocator->has('bar'));
541538
$this->assertTrue($argLocator->has('baz'));
542539

543540
$this->assertSame(iterator_to_array($argIterator), [$argLocator->get('bar'), $argLocator->get('baz')]);
541+
}
542+
543+
public function testAutowireIteratorAndAutowireLocatorAttributes()
544+
{
545+
$container = new ContainerBuilder();
546+
$container->setParameter('some.parameter', 'bar');
547+
$resolver = $container->register('argument_resolver.service', \stdClass::class)->addArgument([]);
548+
549+
$container->register('bar', \stdClass::class)->addTag('foobar');
550+
$container->register('baz', \stdClass::class)->addTag('foobar');
551+
552+
$container->register('foo', WithAutowireIteratorAndAutowireLocator::class)
553+
->addTag('controller.service_arguments');
554+
555+
(new RegisterControllerArgumentLocatorsPass())->process($container);
556+
557+
$locatorId = (string) $resolver->getArgument(0);
558+
$container->getDefinition($locatorId)->setPublic(true);
544559

545-
$this->assertTrue($locator->has('locator2'));
546-
$this->assertInstanceOf(ServiceLocator::class, $argLocator = $locator->get('locator2'));
560+
$container->compile();
561+
562+
/** @var ServiceLocator $locator */
563+
$locator = $container->get($locatorId)->get('foo::fooAction');
564+
565+
$this->assertCount(4, $locator->getProvidedServices());
566+
567+
$this->assertTrue($locator->has('iterator1'));
568+
$this->assertInstanceOf(RewindableGenerator::class, $argIterator = $locator->get('iterator1'));
569+
$this->assertCount(2, $argIterator);
570+
571+
$this->assertTrue($locator->has('locator1'));
572+
$this->assertInstanceOf(ServiceLocator::class, $argLocator = $locator->get('locator1'));
547573
$this->assertCount(2, $argLocator);
548574
$this->assertTrue($argLocator->has('bar'));
549575
$this->assertTrue($argLocator->has('baz'));
@@ -724,9 +750,16 @@ class WithTaggedIteratorAndTaggedLocator
724750
{
725751
public function fooAction(
726752
#[TaggedIterator('foobar')] iterable $iterator1,
727-
#[AutowireIterator('foobar')] iterable $iterator2,
728753
#[TaggedLocator('foobar')] ServiceLocator $locator1,
729-
#[AutowireLocator('foobar')] ServiceLocator $locator2,
754+
) {
755+
}
756+
}
757+
758+
class WithAutowireIteratorAndAutowireLocator
759+
{
760+
public function fooAction(
761+
#[AutowireIterator('foobar')] iterable $iterator1,
762+
#[AutowireLocator('foobar')] ServiceLocator $locator1,
730763
#[AutowireLocator(['bar', 'baz'])] ContainerInterface $container1,
731764
#[AutowireLocator(['foo' => new Autowire('%some.parameter%')])] ContainerInterface $container2,
732765
) {

0 commit comments

Comments
 (0)