diff --git a/src/Symfony/Component/DependencyInjection/Compiler/AttributeAutoconfigurationPass.php b/src/Symfony/Component/DependencyInjection/Compiler/AttributeAutoconfigurationPass.php index f5094996d949f..4db7185cf534b 100644 --- a/src/Symfony/Component/DependencyInjection/Compiler/AttributeAutoconfigurationPass.php +++ b/src/Symfony/Component/DependencyInjection/Compiler/AttributeAutoconfigurationPass.php @@ -15,6 +15,7 @@ use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\DependencyInjection\Definition; use Symfony\Component\DependencyInjection\Exception\LogicException; +use Symfony\Component\DependencyInjection\Exception\RuntimeException; /** * @author Alexander M. Turek @@ -99,11 +100,19 @@ protected function processValue($value, bool $isRoot = false) } } - if ($this->parameterAttributeConfigurators && $constructorReflector = $this->getConstructor($value, false)) { - foreach ($constructorReflector->getParameters() as $parameterReflector) { - foreach ($parameterReflector->getAttributes() as $attribute) { - if ($configurator = $this->parameterAttributeConfigurators[$attribute->getName()] ?? null) { - $configurator($conditionals, $attribute->newInstance(), $parameterReflector); + if ($this->parameterAttributeConfigurators) { + try { + $constructorReflector = $this->getConstructor($value, false); + } catch (RuntimeException $e) { + $constructorReflector = null; + } + + if ($constructorReflector) { + foreach ($constructorReflector->getParameters() as $parameterReflector) { + foreach ($parameterReflector->getAttributes() as $attribute) { + if ($configurator = $this->parameterAttributeConfigurators[$attribute->getName()] ?? null) { + $configurator($conditionals, $attribute->newInstance(), $parameterReflector); + } } } } diff --git a/src/Symfony/Component/DependencyInjection/Tests/Compiler/IntegrationTest.php b/src/Symfony/Component/DependencyInjection/Tests/Compiler/IntegrationTest.php index 1e5df4879673e..6624f74901320 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/Compiler/IntegrationTest.php +++ b/src/Symfony/Component/DependencyInjection/Tests/Compiler/IntegrationTest.php @@ -976,6 +976,11 @@ static function (ChildDefinition $definition, CustomParameterAttribute $attribut ->setPublic(true) ->setAutoconfigured(true); + $container->register('failing_factory', \stdClass::class); + $container->register('ccc', TaggedService4::class) + ->setFactory([new Reference('failing_factory'), 'create']) + ->setAutoconfigured(true); + $collector = new TagCollector(); $container->addCompilerPass($collector); @@ -996,6 +1001,17 @@ static function (ChildDefinition $definition, CustomParameterAttribute $attribut ['property' => 'name'], ['someAttribute' => 'on name', 'priority' => 0, 'property' => 'name'], ], + 'ccc' => [ + ['class' => TaggedService4::class], + ['method' => 'fooAction'], + ['someAttribute' => 'on fooAction', 'priority' => 0, 'method' => 'fooAction'], + ['parameter' => 'param1'], + ['someAttribute' => 'on param1 in fooAction', 'priority' => 0, 'parameter' => 'param1'], + ['method' => 'barAction'], + ['someAttribute' => 'on barAction', 'priority' => 0, 'method' => 'barAction'], + ['property' => 'name'], + ['someAttribute' => 'on name', 'priority' => 0, 'property' => 'name'], + ], ], $collector->collectedTags); }