Skip to content

Commit a689715

Browse files
Merge branch '5.4' into 6.0
* 5.4: (46 commits) move username/password fix to non-deprecated Connection class cs fix [VarDumper] Fix dumping twig templates found in exceptions do not replace definition arguments that have not been configured fix Console tests on Windows [Validator] Add translations for CIDR constraint [Dotenv] Fix testLoadEnv() to start from a fresh context [Console] Add completion to server:dump command bug #42194 [RateLimiter] fix: sliding window policy to use microtime [Validator] Update validators.sr_Cyrl.xlf [Validator] Update validators.sr_Latn.xlf Add suggestions for the option 'format' of lints commands: twig, yaml and xliff [VarDumper] Add support for Fiber uzb translation Update validators.uz.xlf Fix logging of impersonator introduced in 5.3 [Console] Add show proxified command class in completion debug skip command completion tests with older Symfony Console versions [Uid] Allow use autocompletion [Console] Add completion to messenger:setup-transports command ...
2 parents 7c963bd + 593465d commit a689715

11 files changed

+289
-10
lines changed

Attribute/TaggedIterator.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ class TaggedIterator
1717
public function __construct(
1818
public string $tag,
1919
public ?string $indexAttribute = null,
20+
public ?string $defaultIndexMethod = null,
21+
public ?string $defaultPriorityMethod = null,
2022
) {
2123
}
2224
}

Attribute/TaggedLocator.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ class TaggedLocator
1717
public function __construct(
1818
public string $tag,
1919
public ?string $indexAttribute = null,
20+
public ?string $defaultIndexMethod = null,
21+
public ?string $defaultPriorityMethod = null,
2022
) {
2123
}
2224
}

CHANGELOG.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ CHANGELOG
1212

1313
5.4
1414
---
15-
15+
* Add `$defaultIndexMethod` and `$defaultPriorityMethod` to `TaggedIterator` and `TaggedLocator` attributes
1616
* Add `service_closure()` to the PHP-DSL
1717
* Add support for autoconfigurable attributes on methods, properties and parameters
1818
* Make auto-aliases private by default

Compiler/AutowirePass.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -249,13 +249,13 @@ private function autowireMethod(\ReflectionFunctionAbstract $reflectionMethod, a
249249
foreach ($parameter->getAttributes() as $attribute) {
250250
if (TaggedIterator::class === $attribute->getName()) {
251251
$attribute = $attribute->newInstance();
252-
$arguments[$index] = new TaggedIteratorArgument($attribute->tag, $attribute->indexAttribute);
252+
$arguments[$index] = new TaggedIteratorArgument($attribute->tag, $attribute->indexAttribute, $attribute->defaultIndexMethod, false, $attribute->defaultPriorityMethod);
253253
break;
254254
}
255255

256256
if (TaggedLocator::class === $attribute->getName()) {
257257
$attribute = $attribute->newInstance();
258-
$arguments[$index] = new ServiceLocatorArgument(new TaggedIteratorArgument($attribute->tag, $attribute->indexAttribute, null, true));
258+
$arguments[$index] = new ServiceLocatorArgument(new TaggedIteratorArgument($attribute->tag, $attribute->indexAttribute, $attribute->defaultIndexMethod, true, $attribute->defaultPriorityMethod));
259259
break;
260260
}
261261
}

Tests/Compiler/IntegrationTest.php

Lines changed: 165 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,15 @@
3333
use Symfony\Component\DependencyInjection\Tests\Fixtures\FooBarTaggedForDefaultPriorityClass;
3434
use Symfony\Component\DependencyInjection\Tests\Fixtures\FooTagClass;
3535
use Symfony\Component\DependencyInjection\Tests\Fixtures\IteratorConsumer;
36+
use Symfony\Component\DependencyInjection\Tests\Fixtures\IteratorConsumerWithDefaultIndexMethod;
37+
use Symfony\Component\DependencyInjection\Tests\Fixtures\IteratorConsumerWithDefaultIndexMethodAndWithDefaultPriorityMethod;
38+
use Symfony\Component\DependencyInjection\Tests\Fixtures\IteratorConsumerWithDefaultPriorityMethod;
3639
use Symfony\Component\DependencyInjection\Tests\Fixtures\LocatorConsumer;
3740
use Symfony\Component\DependencyInjection\Tests\Fixtures\LocatorConsumerConsumer;
3841
use Symfony\Component\DependencyInjection\Tests\Fixtures\LocatorConsumerFactory;
42+
use Symfony\Component\DependencyInjection\Tests\Fixtures\LocatorConsumerWithDefaultIndexMethod;
43+
use Symfony\Component\DependencyInjection\Tests\Fixtures\LocatorConsumerWithDefaultIndexMethodAndWithDefaultPriorityMethod;
44+
use Symfony\Component\DependencyInjection\Tests\Fixtures\LocatorConsumerWithDefaultPriorityMethod;
3945
use Symfony\Component\DependencyInjection\Tests\Fixtures\LocatorConsumerWithoutIndex;
4046
use Symfony\Component\DependencyInjection\Tests\Fixtures\TaggedService1;
4147
use Symfony\Component\DependencyInjection\Tests\Fixtures\TaggedService2;
@@ -351,30 +357,85 @@ public function testTaggedServiceWithIndexAttributeAndDefaultMethodConfiguredVia
351357
$this->assertSame(['bar_tab_class_with_defaultmethod' => $container->get(BarTagClass::class), 'foo' => $container->get(FooTagClass::class)], $param);
352358
}
353359

354-
public function testTaggedIteratorWithMultipleIndexAttribute()
360+
/**
361+
* @requires PHP 8
362+
*/
363+
public function testTaggedIteratorWithDefaultIndexMethodConfiguredViaAttribute()
355364
{
356365
$container = new ContainerBuilder();
357366
$container->register(BarTagClass::class)
358367
->setPublic(true)
359-
->addTag('foo_bar', ['foo' => 'bar'])
360-
->addTag('foo_bar', ['foo' => 'bar_duplicate'])
368+
->addTag('foo_bar')
361369
;
362370
$container->register(FooTagClass::class)
363371
->setPublic(true)
364372
->addTag('foo_bar')
373+
;
374+
$container->register(IteratorConsumerWithDefaultIndexMethod::class)
375+
->setAutowired(true)
376+
->setPublic(true)
377+
;
378+
379+
$container->compile();
380+
381+
$s = $container->get(IteratorConsumerWithDefaultIndexMethod::class);
382+
383+
$param = iterator_to_array($s->getParam()->getIterator());
384+
$this->assertSame(['bar_tag_class' => $container->get(BarTagClass::class), 'foo_tag_class' => $container->get(FooTagClass::class)], $param);
385+
}
386+
387+
/**
388+
* @requires PHP 8
389+
*/
390+
public function testTaggedIteratorWithDefaultPriorityMethodConfiguredViaAttribute()
391+
{
392+
$container = new ContainerBuilder();
393+
$container->register(BarTagClass::class)
394+
->setPublic(true)
365395
->addTag('foo_bar')
366396
;
367-
$container->register(FooBarTaggedClass::class)
368-
->addArgument(new TaggedIteratorArgument('foo_bar', 'foo'))
397+
$container->register(FooTagClass::class)
398+
->setPublic(true)
399+
->addTag('foo_bar')
400+
;
401+
$container->register(IteratorConsumerWithDefaultPriorityMethod::class)
402+
->setAutowired(true)
369403
->setPublic(true)
370404
;
371405

372406
$container->compile();
373407

374-
$s = $container->get(FooBarTaggedClass::class);
408+
$s = $container->get(IteratorConsumerWithDefaultPriorityMethod::class);
409+
410+
$param = iterator_to_array($s->getParam()->getIterator());
411+
$this->assertSame([0 => $container->get(FooTagClass::class), 1 => $container->get(BarTagClass::class)], $param);
412+
}
413+
414+
/**
415+
* @requires PHP 8
416+
*/
417+
public function testTaggedIteratorWithDefaultIndexMethodAndWithDefaultPriorityMethodConfiguredViaAttribute()
418+
{
419+
$container = new ContainerBuilder();
420+
$container->register(BarTagClass::class)
421+
->setPublic(true)
422+
->addTag('foo_bar')
423+
;
424+
$container->register(FooTagClass::class)
425+
->setPublic(true)
426+
->addTag('foo_bar')
427+
;
428+
$container->register(IteratorConsumerWithDefaultIndexMethodAndWithDefaultPriorityMethod::class)
429+
->setAutowired(true)
430+
->setPublic(true)
431+
;
432+
433+
$container->compile();
434+
435+
$s = $container->get(IteratorConsumerWithDefaultIndexMethodAndWithDefaultPriorityMethod::class);
375436

376437
$param = iterator_to_array($s->getParam()->getIterator());
377-
$this->assertSame(['bar' => $container->get(BarTagClass::class), 'bar_duplicate' => $container->get(BarTagClass::class), 'foo_tag_class' => $container->get(FooTagClass::class)], $param);
438+
$this->assertSame(['foo_tag_class' => $container->get(FooTagClass::class), 'bar_tag_class' => $container->get(BarTagClass::class)], $param);
378439
}
379440

380441
public function testTaggedLocatorConfiguredViaAttribute()
@@ -432,6 +493,103 @@ public function testTaggedLocatorConfiguredViaAttributeWithoutIndex()
432493
self::assertSame($container->get(FooTagClass::class), $locator->get(FooTagClass::class));
433494
}
434495

496+
/**
497+
* @requires PHP 8
498+
*/
499+
public function testTaggedLocatorWithDefaultIndexMethodConfiguredViaAttribute()
500+
{
501+
$container = new ContainerBuilder();
502+
$container->register(BarTagClass::class)
503+
->setPublic(true)
504+
->addTag('foo_bar')
505+
;
506+
$container->register(FooTagClass::class)
507+
->setPublic(true)
508+
->addTag('foo_bar')
509+
;
510+
$container->register(LocatorConsumerWithDefaultIndexMethod::class)
511+
->setAutowired(true)
512+
->setPublic(true)
513+
;
514+
515+
$container->compile();
516+
517+
/** @var LocatorConsumerWithoutIndex $s */
518+
$s = $container->get(LocatorConsumerWithDefaultIndexMethod::class);
519+
520+
$locator = $s->getLocator();
521+
self::assertSame($container->get(BarTagClass::class), $locator->get('bar_tag_class'));
522+
self::assertSame($container->get(FooTagClass::class), $locator->get('foo_tag_class'));
523+
}
524+
525+
/**
526+
* @requires PHP 8
527+
*/
528+
public function testTaggedLocatorWithDefaultPriorityMethodConfiguredViaAttribute()
529+
{
530+
$container = new ContainerBuilder();
531+
$container->register(BarTagClass::class)
532+
->setPublic(true)
533+
->addTag('foo_bar')
534+
;
535+
$container->register(FooTagClass::class)
536+
->setPublic(true)
537+
->addTag('foo_bar')
538+
;
539+
$container->register(LocatorConsumerWithDefaultPriorityMethod::class)
540+
->setAutowired(true)
541+
->setPublic(true)
542+
;
543+
544+
$container->compile();
545+
546+
/** @var LocatorConsumerWithoutIndex $s */
547+
$s = $container->get(LocatorConsumerWithDefaultPriorityMethod::class);
548+
549+
$locator = $s->getLocator();
550+
551+
// We need to check priority of instances in the factories
552+
$factories = (new \ReflectionClass($locator))->getProperty('factories');
553+
$factories->setAccessible(true);
554+
555+
self::assertSame([FooTagClass::class, BarTagClass::class], array_keys($factories->getValue($locator)));
556+
}
557+
558+
/**
559+
* @requires PHP 8
560+
*/
561+
public function testTaggedLocatorWithDefaultIndexMethodAndWithDefaultPriorityMethodConfiguredViaAttribute()
562+
{
563+
$container = new ContainerBuilder();
564+
$container->register(BarTagClass::class)
565+
->setPublic(true)
566+
->addTag('foo_bar')
567+
;
568+
$container->register(FooTagClass::class)
569+
->setPublic(true)
570+
->addTag('foo_bar')
571+
;
572+
$container->register(LocatorConsumerWithDefaultIndexMethodAndWithDefaultPriorityMethod::class)
573+
->setAutowired(true)
574+
->setPublic(true)
575+
;
576+
577+
$container->compile();
578+
579+
/** @var LocatorConsumerWithoutIndex $s */
580+
$s = $container->get(LocatorConsumerWithDefaultIndexMethodAndWithDefaultPriorityMethod::class);
581+
582+
$locator = $s->getLocator();
583+
584+
// We need to check priority of instances in the factories
585+
$factories = (new \ReflectionClass($locator))->getProperty('factories');
586+
$factories->setAccessible(true);
587+
588+
self::assertSame(['foo_tag_class', 'bar_tag_class'], array_keys($factories->getValue($locator)));
589+
self::assertSame($container->get(BarTagClass::class), $locator->get('bar_tag_class'));
590+
self::assertSame($container->get(FooTagClass::class), $locator->get('foo_tag_class'));
591+
}
592+
435593
/**
436594
* @requires PHP 8
437595
*/
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<?php
2+
3+
namespace Symfony\Component\DependencyInjection\Tests\Fixtures;
4+
5+
use Symfony\Component\DependencyInjection\Attribute\TaggedIterator;
6+
7+
final class IteratorConsumerWithDefaultIndexMethod
8+
{
9+
public function __construct(
10+
#[TaggedIterator(tag: 'foo_bar', defaultIndexMethod: 'getDefaultFooName')]
11+
private iterable $param,
12+
) {
13+
}
14+
15+
public function getParam(): iterable
16+
{
17+
return $this->param;
18+
}
19+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<?php
2+
3+
namespace Symfony\Component\DependencyInjection\Tests\Fixtures;
4+
5+
use Symfony\Component\DependencyInjection\Attribute\TaggedIterator;
6+
7+
final class IteratorConsumerWithDefaultIndexMethodAndWithDefaultPriorityMethod
8+
{
9+
public function __construct(
10+
#[TaggedIterator(tag: 'foo_bar', defaultIndexMethod: 'getDefaultFooName', defaultPriorityMethod: 'getPriority')]
11+
private iterable $param,
12+
) {
13+
}
14+
15+
public function getParam(): iterable
16+
{
17+
return $this->param;
18+
}
19+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<?php
2+
3+
namespace Symfony\Component\DependencyInjection\Tests\Fixtures;
4+
5+
use Symfony\Component\DependencyInjection\Attribute\TaggedIterator;
6+
7+
final class IteratorConsumerWithDefaultPriorityMethod
8+
{
9+
public function __construct(
10+
#[TaggedIterator(tag: 'foo_bar', defaultPriorityMethod: 'getPriority')]
11+
private iterable $param,
12+
) {
13+
}
14+
15+
public function getParam(): iterable
16+
{
17+
return $this->param;
18+
}
19+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
<?php
2+
3+
namespace Symfony\Component\DependencyInjection\Tests\Fixtures;
4+
5+
use Psr\Container\ContainerInterface;
6+
use Symfony\Component\DependencyInjection\Attribute\TaggedLocator;
7+
8+
final class LocatorConsumerWithDefaultIndexMethod
9+
{
10+
public function __construct(
11+
#[TaggedLocator(tag: 'foo_bar', defaultIndexMethod: 'getDefaultFooName')]
12+
private ContainerInterface $locator,
13+
) {
14+
}
15+
16+
public function getLocator(): ContainerInterface
17+
{
18+
return $this->locator;
19+
}
20+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
<?php
2+
3+
namespace Symfony\Component\DependencyInjection\Tests\Fixtures;
4+
5+
use Psr\Container\ContainerInterface;
6+
use Symfony\Component\DependencyInjection\Attribute\TaggedLocator;
7+
8+
final class LocatorConsumerWithDefaultIndexMethodAndWithDefaultPriorityMethod
9+
{
10+
public function __construct(
11+
#[TaggedLocator(tag: 'foo_bar', defaultIndexMethod: 'getDefaultFooName', defaultPriorityMethod: 'getPriority')]
12+
private ContainerInterface $locator,
13+
) {
14+
}
15+
16+
public function getLocator(): ContainerInterface
17+
{
18+
return $this->locator;
19+
}
20+
}

0 commit comments

Comments
 (0)