diff --git a/src/Symfony/Component/DependencyInjection/Compiler/ResolveDefinitionTemplatesPass.php b/src/Symfony/Component/DependencyInjection/Compiler/ResolveDefinitionTemplatesPass.php index 7d9f7da4b8..c919950642 100644 --- a/src/Symfony/Component/DependencyInjection/Compiler/ResolveDefinitionTemplatesPass.php +++ b/src/Symfony/Component/DependencyInjection/Compiler/ResolveDefinitionTemplatesPass.php @@ -161,16 +161,11 @@ class ResolveDefinitionTemplatesPass extends AbstractRecursivePass foreach ($definition->getArguments() as $k => $v) { if (is_numeric($k)) { $def->addArgument($v); - continue; + } elseif (0 === strpos($k, 'index_')) { + $def->replaceArgument((int) substr($k, strlen('index_')), $v); + } else { + $def->setArgument($k, $v); } - - if (0 === strpos($k, 'index_')) { - $index = (int) substr($k, strlen('index_')); - } elseif (0 !== strpos($k, '$')) { - throw new RuntimeException(sprintf('Invalid argument key "%s" found.', $k)); - } - - $def->replaceArgument($index, $v); } // merge properties diff --git a/src/Symfony/Component/DependencyInjection/Definition.php b/src/Symfony/Component/DependencyInjection/Definition.php index e3c79c511a..658f1de964 100644 --- a/src/Symfony/Component/DependencyInjection/Definition.php +++ b/src/Symfony/Component/DependencyInjection/Definition.php @@ -216,6 +216,13 @@ class Definition return $this; } + public function setArgument($key, $value) + { + $this->arguments[$key] = $value; + + return $this; + } + /** * Gets the arguments to pass to the service constructor/factory method. * diff --git a/src/Symfony/Component/DependencyInjection/Tests/Compiler/ResolveDefinitionTemplatesPassTest.php b/src/Symfony/Component/DependencyInjection/Tests/Compiler/ResolveDefinitionTemplatesPassTest.php index 306804b610..4a21f4a53b 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/Compiler/ResolveDefinitionTemplatesPassTest.php +++ b/src/Symfony/Component/DependencyInjection/Tests/Compiler/ResolveDefinitionTemplatesPassTest.php @@ -364,6 +364,23 @@ class ResolveDefinitionTemplatesPassTest extends TestCase $this->assertSame('ParentClass', $def->getClass()); } + public function testProcessSetsArguments() + { + $container = new ContainerBuilder(); + + $container->register('parent', 'ParentClass')->setArguments(array(0)); + $container->setDefinition('child', (new ChildDefinition('parent'))->setArguments(array( + 1, + 'index_0' => 2, + 'foo' => 3, + ))); + + $this->process($container); + + $def = $container->getDefinition('child'); + $this->assertSame(array(2, 1, 'foo' => 3), $def->getArguments()); + } + protected function process(ContainerBuilder $container) { $pass = new ResolveDefinitionTemplatesPass();