diff --git a/src/Symfony/Component/DependencyInjection/Compiler/ResolveBindingsPass.php b/src/Symfony/Component/DependencyInjection/Compiler/ResolveBindingsPass.php index 5f0d93711af24..4835472b688b7 100644 --- a/src/Symfony/Component/DependencyInjection/Compiler/ResolveBindingsPass.php +++ b/src/Symfony/Component/DependencyInjection/Compiler/ResolveBindingsPass.php @@ -11,6 +11,7 @@ namespace Symfony\Component\DependencyInjection\Compiler; +use Symfony\Component\DependencyInjection\Argument\AbstractArgument; use Symfony\Component\DependencyInjection\Argument\BoundArgument; use Symfony\Component\DependencyInjection\Argument\ServiceLocatorArgument; use Symfony\Component\DependencyInjection\Argument\TaggedIteratorArgument; @@ -182,10 +183,10 @@ protected function processValue($value, bool $isRoot = false) foreach ($reflectionMethod->getParameters() as $key => $parameter) { $names[$key] = $parameter->name; - if (\array_key_exists($key, $arguments) && '' !== $arguments[$key]) { + if (\array_key_exists($key, $arguments) && '' !== $arguments[$key] && !$arguments[$key] instanceof AbstractArgument) { continue; } - if (\array_key_exists($parameter->name, $arguments) && '' !== $arguments[$parameter->name]) { + if (\array_key_exists($parameter->name, $arguments) && '' !== $arguments[$parameter->name] && !$arguments[$parameter->name] instanceof AbstractArgument) { continue; } @@ -219,7 +220,9 @@ protected function processValue($value, bool $isRoot = false) foreach ($names as $key => $name) { if (\array_key_exists($name, $arguments) && (0 === $key || \array_key_exists($key - 1, $arguments))) { - $arguments[$key] = $arguments[$name]; + if (!array_key_exists($key, $arguments)) { + $arguments[$key] = $arguments[$name]; + } unset($arguments[$name]); } } diff --git a/src/Symfony/Component/DependencyInjection/Tests/Compiler/ResolveBindingsPassTest.php b/src/Symfony/Component/DependencyInjection/Tests/Compiler/ResolveBindingsPassTest.php index 600c8e036c4cd..3b90a24c70c15 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/Compiler/ResolveBindingsPassTest.php +++ b/src/Symfony/Component/DependencyInjection/Tests/Compiler/ResolveBindingsPassTest.php @@ -12,6 +12,7 @@ namespace Symfony\Component\DependencyInjection\Tests\Compiler; use PHPUnit\Framework\TestCase; +use Symfony\Component\DependencyInjection\Argument\AbstractArgument; use Symfony\Component\DependencyInjection\Argument\BoundArgument; use Symfony\Component\DependencyInjection\Argument\ServiceLocatorArgument; use Symfony\Component\DependencyInjection\Argument\TaggedIteratorArgument; @@ -262,11 +263,23 @@ public function testBindWithNamedArgs() $definition->setArguments(['c' => 'C', 'hostName' => 'H']); $definition->setBindings($bindings); - $container->register('foo', CaseSensitiveClass::class); - $pass = new ResolveBindingsPass(); $pass->process($container); $this->assertEquals(['C', 'K', 'H'], $definition->getArguments()); } + + public function testAbstractArg() + { + $container = new ContainerBuilder(); + + $definition = $container->register(NamedArgumentsDummy::class, NamedArgumentsDummy::class); + $definition->setArguments([new AbstractArgument(), 'apiKey' => new AbstractArgument()]); + $definition->setBindings(['$c' => new BoundArgument('C'), '$apiKey' => new BoundArgument('K')]); + + $pass = new ResolveBindingsPass(); + $pass->process($container); + + $this->assertEquals(['C', 'K'], $definition->getArguments()); + } }