[DI] Fix named args overridding

This commit is contained in:
Nicolas Grekas 2017-04-10 16:38:35 +02:00
parent 549af739af
commit 0c030d92f9
3 changed files with 28 additions and 9 deletions

View File

@ -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

View File

@ -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.
*

View File

@ -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();