diff --git a/src/Symfony/Component/DependencyInjection/Argument/TaggedIteratorArgument.php b/src/Symfony/Component/DependencyInjection/Argument/TaggedIteratorArgument.php
index c88b174169054..3fb6900ce5094 100644
--- a/src/Symfony/Component/DependencyInjection/Argument/TaggedIteratorArgument.php
+++ b/src/Symfony/Component/DependencyInjection/Argument/TaggedIteratorArgument.php
@@ -22,14 +22,16 @@ class TaggedIteratorArgument extends IteratorArgument
private $indexAttribute;
private $defaultIndexMethod;
private $needsIndexes = false;
+ private $defaultPriorityMethod;
/**
- * @param string $tag The name of the tag identifying the target services
- * @param string|null $indexAttribute The name of the attribute that defines the key referencing each service in the tagged collection
- * @param string|null $defaultIndexMethod The static method that should be called to get each service's key when their tag doesn't define the previous attribute
- * @param bool $needsIndexes Whether indexes are required and should be generated when computing the map
+ * @param string $tag The name of the tag identifying the target services
+ * @param string|null $indexAttribute The name of the attribute that defines the key referencing each service in the tagged collection
+ * @param string|null $defaultIndexMethod The static method that should be called to get each service's key when their tag doesn't define the previous attribute
+ * @param bool $needsIndexes Whether indexes are required and should be generated when computing the map
+ * @param string|null $defaultPriorityMethod The static method that should be called to get the default priority of the service
*/
- public function __construct(string $tag, string $indexAttribute = null, string $defaultIndexMethod = null, bool $needsIndexes = false)
+ public function __construct(string $tag, string $indexAttribute = null, string $defaultIndexMethod = null, bool $needsIndexes = false, string $defaultPriorityMethod = null)
{
parent::__construct([]);
@@ -41,6 +43,7 @@ public function __construct(string $tag, string $indexAttribute = null, string $
$this->indexAttribute = $indexAttribute;
$this->defaultIndexMethod = $defaultIndexMethod ?: ('getDefault'.str_replace(' ', '', ucwords(preg_replace('/[^a-zA-Z0-9\x7f-\xff]++/', ' ', $indexAttribute ?? ''))).'Name');
$this->needsIndexes = $needsIndexes;
+ $this->defaultPriorityMethod = $defaultPriorityMethod;
}
public function getTag()
@@ -62,4 +65,9 @@ public function needsIndexes(): bool
{
return $this->needsIndexes;
}
+
+ public function getDefaultPriorityMethod(): ?string
+ {
+ return $this->defaultPriorityMethod;
+ }
}
diff --git a/src/Symfony/Component/DependencyInjection/CHANGELOG.md b/src/Symfony/Component/DependencyInjection/CHANGELOG.md
index 7d30dbc646383..db16595902901 100644
--- a/src/Symfony/Component/DependencyInjection/CHANGELOG.md
+++ b/src/Symfony/Component/DependencyInjection/CHANGELOG.md
@@ -6,6 +6,7 @@ CHANGELOG
* deprecated support for short factories and short configurators in Yaml
* deprecated `tagged` in favor of `tagged_iterator`
+ * added ability to define a priority method for a tagged collection
4.3.0
-----
diff --git a/src/Symfony/Component/DependencyInjection/Compiler/PriorityTaggedServiceTrait.php b/src/Symfony/Component/DependencyInjection/Compiler/PriorityTaggedServiceTrait.php
index 5f04eadef8279..b2abe5e3f5270 100644
--- a/src/Symfony/Component/DependencyInjection/Compiler/PriorityTaggedServiceTrait.php
+++ b/src/Symfony/Component/DependencyInjection/Compiler/PriorityTaggedServiceTrait.php
@@ -41,19 +41,41 @@ trait PriorityTaggedServiceTrait
*/
private function findAndSortTaggedServices($tagName, ContainerBuilder $container)
{
- $indexAttribute = $defaultIndexMethod = $needsIndexes = null;
+ $indexAttribute = $defaultIndexMethod = $needsIndexes = $defaultPriorityMethod = null;
if ($tagName instanceof TaggedIteratorArgument) {
$indexAttribute = $tagName->getIndexAttribute();
$defaultIndexMethod = $tagName->getDefaultIndexMethod();
$needsIndexes = $tagName->needsIndexes();
+ $defaultPriorityMethod = $tagName->getDefaultPriorityMethod();
$tagName = $tagName->getTag();
}
$services = [];
foreach ($container->findTaggedServiceIds($tagName, true) as $serviceId => $attributes) {
- $priority = isset($attributes[0]['priority']) ? $attributes[0]['priority'] : 0;
+ $class = $container->getDefinition($serviceId)->getClass();
+ $class = $container->getParameterBag()->resolveValue($class) ?: null;
+ $reflectionClass = $container->getReflectionClass($class);
+
+ $priority = 0;
+ if (null !== $defaultPriorityMethod && null !== $reflectionClass && $reflectionClass->hasMethod($defaultPriorityMethod)) {
+ if (!($priorityReflMethod = $reflectionClass->getMethod($defaultPriorityMethod))->isStatic()) {
+ throw new InvalidArgumentException(sprintf('Default priority method "%s::%s()" of the "%s"-tagged collection on service "%s" must be static.', $class, $defaultPriorityMethod, $tagName, $serviceId));
+ }
+
+ if (!$priorityReflMethod->isPublic()) {
+ throw new InvalidArgumentException(sprintf('Default priority method "%s::%s()" of the "%s"-tagged collection on service "%s" should be public.', $class, $defaultPriorityMethod, $tagName, $serviceId));
+ }
+
+ $priority = $priorityReflMethod->invoke(null);
+
+ if (!\is_int($priority)) {
+ throw new InvalidArgumentException(sprintf('Default priority method "%s::%s()" of the "%s"-tagged collection on service "%s" should return an integer, got %s.', $class, $defaultPriorityMethod, $tagName, $serviceId, \gettype($priority)));
+ }
+ }
+
+ $priority = $attributes[0]['priority'] ?? $priority;
if (null === $indexAttribute && !$needsIndexes) {
$services[$priority][] = new Reference($serviceId);
@@ -61,22 +83,19 @@ private function findAndSortTaggedServices($tagName, ContainerBuilder $container
continue;
}
- $class = $container->getDefinition($serviceId)->getClass();
- $class = $container->getParameterBag()->resolveValue($class) ?: null;
-
if (null !== $indexAttribute && isset($attributes[0][$indexAttribute])) {
$services[$priority][$attributes[0][$indexAttribute]] = new TypedReference($serviceId, $class, ContainerBuilder::EXCEPTION_ON_INVALID_REFERENCE, $attributes[0][$indexAttribute]);
continue;
}
- if (!$r = $container->getReflectionClass($class)) {
+ if (null === $reflectionClass) {
throw new InvalidArgumentException(sprintf('Class "%s" used for service "%s" cannot be found.', $class, $serviceId));
}
- $class = $r->name;
+ $class = $reflectionClass->name;
- if (!$r->hasMethod($defaultIndexMethod)) {
+ if (!$reflectionClass->hasMethod($defaultIndexMethod)) {
if ($needsIndexes) {
$services[$priority][$serviceId] = new TypedReference($serviceId, $class);
@@ -86,7 +105,7 @@ private function findAndSortTaggedServices($tagName, ContainerBuilder $container
throw new InvalidArgumentException(sprintf('Method "%s::%s()" not found: tag "%s" on service "%s" is missing "%s" attribute.', $class, $defaultIndexMethod, $tagName, $serviceId, $indexAttribute));
}
- if (!($rm = $r->getMethod($defaultIndexMethod))->isStatic()) {
+ if (!($rm = $reflectionClass->getMethod($defaultIndexMethod))->isStatic()) {
throw new InvalidArgumentException(sprintf('Method "%s::%s()" should be static: tag "%s" on service "%s" is missing "%s" attribute.', $class, $defaultIndexMethod, $tagName, $serviceId, $indexAttribute));
}
diff --git a/src/Symfony/Component/DependencyInjection/Dumper/XmlDumper.php b/src/Symfony/Component/DependencyInjection/Dumper/XmlDumper.php
index ca7bb60a9bf62..a7d30b484bb27 100644
--- a/src/Symfony/Component/DependencyInjection/Dumper/XmlDumper.php
+++ b/src/Symfony/Component/DependencyInjection/Dumper/XmlDumper.php
@@ -297,6 +297,10 @@ private function convertParameters(array $parameters, $type, \DOMElement $parent
$element->setAttribute('default-index-method', $tag->getDefaultIndexMethod());
}
}
+
+ if (null !== $tag->getDefaultPriorityMethod()) {
+ $element->setAttribute('default-priority-method', $tag->getDefaultPriorityMethod());
+ }
} elseif ($value instanceof IteratorArgument) {
$element->setAttribute('type', 'iterator');
$this->convertParameters($value->getValues(), $type, $element, 'key');
diff --git a/src/Symfony/Component/DependencyInjection/Dumper/YamlDumper.php b/src/Symfony/Component/DependencyInjection/Dumper/YamlDumper.php
index cb89bb1758e09..22f9dc1714fe1 100644
--- a/src/Symfony/Component/DependencyInjection/Dumper/YamlDumper.php
+++ b/src/Symfony/Component/DependencyInjection/Dumper/YamlDumper.php
@@ -235,19 +235,24 @@ private function dumpValue($value)
$tag = $value;
if ($value instanceof TaggedIteratorArgument || ($value instanceof ServiceLocatorArgument && $tag = $value->getTaggedIteratorArgument())) {
- if (null === $tag->getIndexAttribute()) {
- $content = $tag->getTag();
- } else {
- $content = [
- 'tag' => $tag->getTag(),
- 'index_by' => $tag->getIndexAttribute(),
- ];
+ $content = ['tag' => $tag->getTag()];
+
+ if (null !== $tag->getIndexAttribute()) {
+ $content['index_by'] = $tag->getIndexAttribute();
if (null !== $tag->getDefaultIndexMethod()) {
$content['default_index_method'] = $tag->getDefaultIndexMethod();
}
}
+ if (null !== $tag->getDefaultPriorityMethod()) {
+ $content['default_priority_method'] = $tag->getDefaultPriorityMethod();
+ }
+
+ if (1 === \count($content)) {
+ $content = $tag->getTag();
+ }
+
return new TaggedValue($value instanceof TaggedIteratorArgument ? 'tagged_iterator' : 'tagged_locator', $content);
}
diff --git a/src/Symfony/Component/DependencyInjection/Loader/Configurator/ContainerConfigurator.php b/src/Symfony/Component/DependencyInjection/Loader/Configurator/ContainerConfigurator.php
index 87beeaa392527..0f571cf826b9a 100644
--- a/src/Symfony/Component/DependencyInjection/Loader/Configurator/ContainerConfigurator.php
+++ b/src/Symfony/Component/DependencyInjection/Loader/Configurator/ContainerConfigurator.php
@@ -118,27 +118,27 @@ function iterator(array $values): IteratorArgument
*
* @deprecated since Symfony 4.4, to be removed in 5.0, use "tagged_iterator" instead.
*/
-function tagged(string $tag, string $indexAttribute = null, string $defaultIndexMethod = null): TaggedIteratorArgument
+function tagged(string $tag, string $indexAttribute = null, string $defaultIndexMethod = null, bool $needsIndexes = false, string $defaultPriorityMethod = null): TaggedIteratorArgument
{
@trigger_error(__NAMESPACE__.'\tagged() is deprecated since Symfony 4.4 and will be removed in 5.0, use '.__NAMESPACE__.'\tagged_iterator() instead.', E_USER_DEPRECATED);
- return new TaggedIteratorArgument($tag, $indexAttribute, $defaultIndexMethod);
+ return new TaggedIteratorArgument($tag, $indexAttribute, $defaultIndexMethod, $needsIndexes, $defaultPriorityMethod);
}
/**
* Creates a lazy iterator by tag name.
*/
-function tagged_iterator(string $tag, string $indexAttribute = null, string $defaultIndexMethod = null): TaggedIteratorArgument
+function tagged_iterator(string $tag, string $indexAttribute = null, string $defaultIndexMethod = null, bool $needsIndexes = false, string $defaultPriorityMethod = null): TaggedIteratorArgument
{
- return new TaggedIteratorArgument($tag, $indexAttribute, $defaultIndexMethod);
+ return new TaggedIteratorArgument($tag, $indexAttribute, $defaultIndexMethod, $needsIndexes, $defaultPriorityMethod);
}
/**
* Creates a service locator by tag name.
*/
-function tagged_locator(string $tag, string $indexAttribute, string $defaultIndexMethod = null): ServiceLocatorArgument
+function tagged_locator(string $tag, string $indexAttribute, string $defaultIndexMethod = null, bool $needsIndexes = true, string $defaultPriorityMethod = null): ServiceLocatorArgument
{
- return new ServiceLocatorArgument(new TaggedIteratorArgument($tag, $indexAttribute, $defaultIndexMethod, true));
+ return new ServiceLocatorArgument(new TaggedIteratorArgument($tag, $indexAttribute, $defaultIndexMethod, $needsIndexes, $defaultPriorityMethod));
}
/**
diff --git a/src/Symfony/Component/DependencyInjection/Loader/XmlFileLoader.php b/src/Symfony/Component/DependencyInjection/Loader/XmlFileLoader.php
index 3980b8618e1d2..6d2775444dd65 100644
--- a/src/Symfony/Component/DependencyInjection/Loader/XmlFileLoader.php
+++ b/src/Symfony/Component/DependencyInjection/Loader/XmlFileLoader.php
@@ -556,7 +556,7 @@ private function getArgumentsAsPhp(\DOMElement $node, $name, $file, $lowercase =
throw new InvalidArgumentException(sprintf('Tag "<%s>" with type="%s" has no or empty "tag" attribute in "%s".', $name, $type, $file));
}
- $arguments[$key] = new TaggedIteratorArgument($arg->getAttribute('tag'), $arg->getAttribute('index-by') ?: null, $arg->getAttribute('default-index-method') ?: null, $forLocator);
+ $arguments[$key] = new TaggedIteratorArgument($arg->getAttribute('tag'), $arg->getAttribute('index-by') ?: null, $arg->getAttribute('default-index-method') ?: null, $forLocator, $arg->getAttribute('default-priority-method') ?: null);
if ($forLocator) {
$arguments[$key] = new ServiceLocatorArgument($arguments[$key]);
diff --git a/src/Symfony/Component/DependencyInjection/Loader/YamlFileLoader.php b/src/Symfony/Component/DependencyInjection/Loader/YamlFileLoader.php
index 25cb14b193c40..7f8eb0ca2e403 100644
--- a/src/Symfony/Component/DependencyInjection/Loader/YamlFileLoader.php
+++ b/src/Symfony/Component/DependencyInjection/Loader/YamlFileLoader.php
@@ -737,11 +737,11 @@ private function resolveServices($value, $file, $isParameter = false)
}
if (\is_array($argument) && isset($argument['tag']) && $argument['tag']) {
- if ($diff = array_diff(array_keys($argument), ['tag', 'index_by', 'default_index_method'])) {
- throw new InvalidArgumentException(sprintf('"!%s" tag contains unsupported key "%s"; supported ones are "tag", "index_by" and "default_index_method".', $value->getTag(), implode('"", "', $diff)));
+ if ($diff = array_diff(array_keys($argument), ['tag', 'index_by', 'default_index_method', 'default_priority_method'])) {
+ throw new InvalidArgumentException(sprintf('"!%s" tag contains unsupported key "%s"; supported ones are "tag", "index_by", "default_index_method" and "default_priority_method".', $value->getTag(), implode('"", "', $diff)));
}
- $argument = new TaggedIteratorArgument($argument['tag'], $argument['index_by'], $argument['default_index_method'] ?? null, $forLocator);
+ $argument = new TaggedIteratorArgument($argument['tag'], $argument['index_by'] ?? null, $argument['default_index_method'] ?? null, $forLocator, $argument['default_priority_method'] ?? null);
if ($forLocator) {
$argument = new ServiceLocatorArgument($argument);
diff --git a/src/Symfony/Component/DependencyInjection/Loader/schema/dic/services/services-1.0.xsd b/src/Symfony/Component/DependencyInjection/Loader/schema/dic/services/services-1.0.xsd
index 2da07fde4e2ee..b491196af75f5 100644
--- a/src/Symfony/Component/DependencyInjection/Loader/schema/dic/services/services-1.0.xsd
+++ b/src/Symfony/Component/DependencyInjection/Loader/schema/dic/services/services-1.0.xsd
@@ -236,6 +236,7 @@
+
diff --git a/src/Symfony/Component/DependencyInjection/Tests/Compiler/IntegrationTest.php b/src/Symfony/Component/DependencyInjection/Tests/Compiler/IntegrationTest.php
index 83d3e23d3ba5a..698e3e1accf43 100644
--- a/src/Symfony/Component/DependencyInjection/Tests/Compiler/IntegrationTest.php
+++ b/src/Symfony/Component/DependencyInjection/Tests/Compiler/IntegrationTest.php
@@ -402,6 +402,30 @@ public function testTaggedServiceLocatorWithDefaultIndex()
];
$this->assertSame($expected, ['baz' => $serviceLocator->get('baz')]);
}
+
+ public function testTaggedServiceWithPriorityMethod()
+ {
+ $container = new ContainerBuilder();
+ $container->register(BarTagClass::class)
+ ->setPublic(true)
+ ->addTag('foo_bar', ['priority' => 10])
+ ;
+ $container->register(FooTagClass::class)
+ ->setPublic(true)
+ ->addTag('foo_bar')
+ ;
+ $container->register(FooBarTaggedClass::class)
+ ->addArgument(new TaggedIteratorArgument('foo_bar', null, null, false, 'getDefaultPriority'))
+ ->setPublic(true)
+ ;
+
+ $container->compile();
+
+ $s = $container->get(FooBarTaggedClass::class);
+
+ $param = iterator_to_array($s->getParam()->getIterator());
+ $this->assertSame([0 => $container->get(FooTagClass::class), 1 => $container->get(BarTagClass::class)], $param);
+ }
}
class ServiceSubscriberStub implements ServiceSubscriberInterface
diff --git a/src/Symfony/Component/DependencyInjection/Tests/Dumper/XmlDumperTest.php b/src/Symfony/Component/DependencyInjection/Tests/Dumper/XmlDumperTest.php
index cc80a69455b97..676ee81b9bab0 100644
--- a/src/Symfony/Component/DependencyInjection/Tests/Dumper/XmlDumperTest.php
+++ b/src/Symfony/Component/DependencyInjection/Tests/Dumper/XmlDumperTest.php
@@ -220,6 +220,24 @@ public function testTaggedArguments()
$this->assertStringEqualsFile(self::$fixturesPath.'/xml/services_with_tagged_arguments.xml', $dumper->dump());
}
+ public function testTaggedWithDefaultPriorityMethod()
+ {
+ $taggedIterator = new TaggedIteratorArgument('foo_tag', null, null, false, 'foopriority');
+ $container = new ContainerBuilder();
+ $container->register('foo', 'Foo')->addTag('foo_tag');
+ $container->register('foo_tagged_iterator', 'Bar')
+ ->setPublic(true)
+ ->addArgument($taggedIterator)
+ ;
+ $container->register('foo_tagged_locator', 'Bar')
+ ->setPublic(true)
+ ->addArgument(new ServiceLocatorArgument($taggedIterator))
+ ;
+
+ $dumper = new XmlDumper($container);
+ $this->assertStringEqualsFile(self::$fixturesPath.'/xml/services_with_tagged_priority_method.xml', $dumper->dump());
+ }
+
public function testDumpAbstractServices()
{
$container = include self::$fixturesPath.'/containers/container_abstract.php';
diff --git a/src/Symfony/Component/DependencyInjection/Tests/Dumper/YamlDumperTest.php b/src/Symfony/Component/DependencyInjection/Tests/Dumper/YamlDumperTest.php
index 72901c855e414..8742f7e8390b1 100644
--- a/src/Symfony/Component/DependencyInjection/Tests/Dumper/YamlDumperTest.php
+++ b/src/Symfony/Component/DependencyInjection/Tests/Dumper/YamlDumperTest.php
@@ -109,6 +109,18 @@ public function testTaggedArguments()
$this->assertStringEqualsFile(self::$fixturesPath.'/yaml/services_with_tagged_argument.yml', $dumper->dump());
}
+ public function testTaggedWithDefaultPriorityMethod()
+ {
+ $taggedIterator = new TaggedIteratorArgument('foo', null, null, false, 'foopriority');
+ $container = new ContainerBuilder();
+ $container->register('foo_service', 'Foo')->addTag('foo');
+ $container->register('foo_service_tagged_iterator', 'Bar')->addArgument($taggedIterator);
+ $container->register('foo_service_tagged_locator', 'Bar')->addArgument(new ServiceLocatorArgument($taggedIterator));
+
+ $dumper = new YamlDumper($container);
+ $this->assertStringEqualsFile(self::$fixturesPath.'/yaml/services_with_tagged_priority_method.yml', $dumper->dump());
+ }
+
private function assertEqualYamlStructure($expected, $yaml, $message = '')
{
$parser = new Parser();
diff --git a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/FooTagClass.php b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/FooTagClass.php
index c1279b9a9feeb..7ec13a33d5486 100644
--- a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/FooTagClass.php
+++ b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/FooTagClass.php
@@ -8,4 +8,9 @@ public static function getDefaultFooName()
{
return 'foo_tag_class';
}
+
+ public static function getDefaultPriority()
+ {
+ return 20;
+ }
}
diff --git a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services_with_tagged_priority_method.xml b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services_with_tagged_priority_method.xml
new file mode 100644
index 0000000000000..d446bfc855a27
--- /dev/null
+++ b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services_with_tagged_priority_method.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/services_with_tagged_priority_method.yml b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/services_with_tagged_priority_method.yml
new file mode 100644
index 0000000000000..743751f4ed52b
--- /dev/null
+++ b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/services_with_tagged_priority_method.yml
@@ -0,0 +1,22 @@
+
+services:
+ service_container:
+ class: Symfony\Component\DependencyInjection\ContainerInterface
+ public: true
+ synthetic: true
+ foo_service:
+ class: Foo
+ tags:
+ - { name: foo }
+ foo_service_tagged_iterator:
+ class: Bar
+ arguments: [!tagged_iterator { tag: foo, default_priority_method: foopriority }]
+ foo_service_tagged_locator:
+ class: Bar
+ arguments: [!tagged_locator { tag: foo, default_priority_method: foopriority }]
+ Psr\Container\ContainerInterface:
+ alias: service_container
+ public: false
+ Symfony\Component\DependencyInjection\ContainerInterface:
+ alias: service_container
+ public: false
diff --git a/src/Symfony/Component/DependencyInjection/Tests/Loader/XmlFileLoaderTest.php b/src/Symfony/Component/DependencyInjection/Tests/Loader/XmlFileLoaderTest.php
index b57f10c597f53..7e618b6eb96d8 100644
--- a/src/Symfony/Component/DependencyInjection/Tests/Loader/XmlFileLoaderTest.php
+++ b/src/Symfony/Component/DependencyInjection/Tests/Loader/XmlFileLoaderTest.php
@@ -336,6 +336,23 @@ public function testParseTaggedArgumentsWithIndexBy()
$this->assertEquals(new ServiceLocatorArgument($taggedIterator), $container->getDefinition('foo_tagged_locator')->getArgument(0));
}
+ public function testParseTaggedArgumentsWithPriority()
+ {
+ $container = new ContainerBuilder();
+ $loader = new XmlFileLoader($container, new FileLocator(self::$fixturesPath.'/xml'));
+ $loader->load('services_with_tagged_priority_method.xml');
+
+ $this->assertCount(1, $container->getDefinition('foo')->getTag('foo_tag'));
+ $this->assertCount(1, $container->getDefinition('foo_tagged_iterator')->getArguments());
+ $this->assertCount(1, $container->getDefinition('foo_tagged_locator')->getArguments());
+
+ $taggedIterator = new TaggedIteratorArgument('foo_tag', null, null, false, 'foopriority');
+ $this->assertEquals($taggedIterator, $container->getDefinition('foo_tagged_iterator')->getArgument(0));
+
+ $taggedIterator = new TaggedIteratorArgument('foo_tag', null, null, true, 'foopriority');
+ $this->assertEquals(new ServiceLocatorArgument($taggedIterator), $container->getDefinition('foo_tagged_locator')->getArgument(0));
+ }
+
/**
* @expectedException \Symfony\Component\DependencyInjection\Exception\InvalidArgumentException
*/
diff --git a/src/Symfony/Component/DependencyInjection/Tests/Loader/YamlFileLoaderTest.php b/src/Symfony/Component/DependencyInjection/Tests/Loader/YamlFileLoaderTest.php
index 0aa30f288c701..0fb4307b27c81 100644
--- a/src/Symfony/Component/DependencyInjection/Tests/Loader/YamlFileLoaderTest.php
+++ b/src/Symfony/Component/DependencyInjection/Tests/Loader/YamlFileLoaderTest.php
@@ -317,6 +317,23 @@ public function testTaggedArgumentsWithIndex()
$this->assertEquals(new ServiceLocatorArgument($taggedIterator), $container->getDefinition('foo_service_tagged_locator')->getArgument(0));
}
+ public function testParseTaggedArgumentsWithPriority()
+ {
+ $container = new ContainerBuilder();
+ $loader = new YamlFileLoader($container, new FileLocator(self::$fixturesPath.'/yaml'));
+ $loader->load('services_with_tagged_priority_method.yml');
+
+ $this->assertCount(1, $container->getDefinition('foo_service')->getTag('foo'));
+ $this->assertCount(1, $container->getDefinition('foo_service_tagged_iterator')->getArguments());
+ $this->assertCount(1, $container->getDefinition('foo_service_tagged_locator')->getArguments());
+
+ $taggedIterator = new TaggedIteratorArgument('foo', null, null, false, 'foopriority');
+ $this->assertEquals($taggedIterator, $container->getDefinition('foo_service_tagged_iterator')->getArgument(0));
+
+ $taggedIterator = new TaggedIteratorArgument('foo', null, null, true, 'foopriority');
+ $this->assertEquals(new ServiceLocatorArgument($taggedIterator), $container->getDefinition('foo_service_tagged_locator')->getArgument(0));
+ }
+
public function testNameOnlyTagsAreAllowedAsString()
{
$container = new ContainerBuilder();