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())); + } } pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

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:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy