diff --git a/src/Symfony/Component/DependencyInjection/Compiler/ResolveAutowireInlineAttributesPass.php b/src/Symfony/Component/DependencyInjection/Compiler/ResolveAutowireInlineAttributesPass.php index 5073b62e5d78e..e2df19d731fe7 100644 --- a/src/Symfony/Component/DependencyInjection/Compiler/ResolveAutowireInlineAttributesPass.php +++ b/src/Symfony/Component/DependencyInjection/Compiler/ResolveAutowireInlineAttributesPass.php @@ -52,18 +52,13 @@ protected function processValue(mixed $value, bool $isRoot = false): mixed } } - $dummy = $value; - while (null === $dummy->getClass() && $dummy instanceof ChildDefinition) { - $dummy = $this->container->findDefinition($dummy->getParent()); - } - $methodCalls = $value->getMethodCalls(); foreach ($methodCalls as $i => $call) { [$method, $arguments] = $call; try { - $method = $this->getReflectionMethod($dummy, $method); + $method = $this->getReflectionMethod($value, $method); } catch (RuntimeException) { continue; } @@ -89,19 +84,14 @@ private function registerAutowireInlineAttributes(\ReflectionFunctionAbstract $m if ($method->isVariadic()) { array_pop($parameters); } - $dummyContainer = new ContainerBuilder($this->container->getParameterBag()); + $paramResolverContainer = new ContainerBuilder($this->container->getParameterBag()); foreach ($parameters as $index => $parameter) { if ($isChildDefinition) { $index = 'index_'.$index; } - $name = '$'.$parameter->name; - if (\array_key_exists($name, $arguments)) { - $arguments[$index] = $arguments[$name]; - unset($arguments[$name]); - } - if (\array_key_exists($index, $arguments) && '' !== $arguments[$index]) { + if (\array_key_exists('$'.$parameter->name, $arguments) || (\array_key_exists($index, $arguments) && '' !== $arguments[$index])) { continue; } if (!$attribute = $parameter->getAttributes(AutowireInline::class, \ReflectionAttribute::IS_INSTANCEOF)[0] ?? null) { @@ -117,13 +107,13 @@ private function registerAutowireInlineAttributes(\ReflectionFunctionAbstract $m $attribute = $attribute->newInstance(); $definition = $attribute->buildDefinition($attribute->value, $type, $parameter); - $dummyContainer->setDefinition('.autowire_inline', $definition); - (new ResolveParameterPlaceHoldersPass(false, false))->process($dummyContainer); + $paramResolverContainer->setDefinition('.autowire_inline', $definition); + (new ResolveParameterPlaceHoldersPass(false, false))->process($paramResolverContainer); $id = '.autowire_inline.'.ContainerBuilder::hash([$this->currentId, $method->class ?? null, $method->name, (string) $parameter]); $this->container->setDefinition($id, $definition); - $arguments[$index] = new Reference($id); + $arguments[$isChildDefinition ? '$'.$parameter->name : $index] = new Reference($id); if ($definition->isAutowired()) { $currentId = $this->currentId; diff --git a/src/Symfony/Component/DependencyInjection/Tests/Compiler/ResolveAutowireInlineAttributesPassTest.php b/src/Symfony/Component/DependencyInjection/Tests/Compiler/ResolveAutowireInlineAttributesPassTest.php index bae6a3ada8ff7..c44e95e00c5c1 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/Compiler/ResolveAutowireInlineAttributesPassTest.php +++ b/src/Symfony/Component/DependencyInjection/Tests/Compiler/ResolveAutowireInlineAttributesPassTest.php @@ -12,6 +12,7 @@ namespace Symfony\Component\DependencyInjection\Tests\Compiler; use PHPUnit\Framework\TestCase; +use Symfony\Component\DependencyInjection\ChildDefinition; use Symfony\Component\DependencyInjection\Compiler\AutowirePass; use Symfony\Component\DependencyInjection\Compiler\ResolveAutowireInlineAttributesPass; use Symfony\Component\DependencyInjection\Compiler\ResolveChildDefinitionsPass; @@ -53,4 +54,16 @@ public function testAttribute() self::assertInstanceOf(AutowireInlineAttributes2::class, $a->inlined); self::assertSame(345, $a->inlined->bar); } + + public function testChildDefinition() + { + $container = new ContainerBuilder(); + + $container->setDefinition('autowire_inline1', (new ChildDefinition('parent'))->setClass(AutowireInlineAttributes1::class)) + ->setAutowired(true); + + (new ResolveAutowireInlineAttributesPass())->process($container); + + $this->assertSame(['$inlined'], array_keys($container->getDefinition('autowire_inline1')->getArguments())); + } }
Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.
Alternative Proxies: