diff --git a/src/Symfony/Component/DependencyInjection/Compiler/RemoveUnusedDefinitionsPass.php b/src/Symfony/Component/DependencyInjection/Compiler/RemoveUnusedDefinitionsPass.php index 67d92ca0323f..287af23b77f0 100644 --- a/src/Symfony/Component/DependencyInjection/Compiler/RemoveUnusedDefinitionsPass.php +++ b/src/Symfony/Component/DependencyInjection/Compiler/RemoveUnusedDefinitionsPass.php @@ -70,7 +70,7 @@ public function process(ContainerBuilder $container) foreach ($container->getDefinitions() as $id => $definition) { if (!isset($connectedIds[$id])) { $container->removeDefinition($id); - $container->resolveEnvPlaceholders(serialize($definition)); + $container->resolveEnvPlaceholders(!$definition->hasErrors() ? serialize($definition) : $definition); $container->log($this, sprintf('Removed service "%s"; reason: unused.', $id)); } } diff --git a/src/Symfony/Component/DependencyInjection/ContainerBuilder.php b/src/Symfony/Component/DependencyInjection/ContainerBuilder.php index 25cef99de875..943df8d314f1 100644 --- a/src/Symfony/Component/DependencyInjection/ContainerBuilder.php +++ b/src/Symfony/Component/DependencyInjection/ContainerBuilder.php @@ -1394,6 +1394,10 @@ public function resolveEnvPlaceholders($value, $format = null, array &$usedEnvs $value = $bag->resolveValue($value); } + if ($value instanceof Definition) { + $value = (array) $value; + } + if (\is_array($value)) { $result = []; foreach ($value as $k => $v) { diff --git a/src/Symfony/Component/DependencyInjection/Tests/Compiler/RemoveUnusedDefinitionsPassTest.php b/src/Symfony/Component/DependencyInjection/Tests/Compiler/RemoveUnusedDefinitionsPassTest.php index 8b92a33e23f6..b7c98e70d2bc 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/Compiler/RemoveUnusedDefinitionsPassTest.php +++ b/src/Symfony/Component/DependencyInjection/Tests/Compiler/RemoveUnusedDefinitionsPassTest.php @@ -142,6 +142,24 @@ public function testProcessDoesNotErrorOnServicesThatDoNotHaveDefinitions() $this->assertFalse($container->hasDefinition('not.defined')); } + public function testProcessWorksWithClosureErrorsInDefinitions() + { + $definition = new Definition(); + $definition->addError(function () { + return 'foo bar'; + }); + + $container = new ContainerBuilder(); + $container + ->setDefinition('foo', $definition) + ->setPublic(false) + ; + + $this->process($container); + + $this->assertFalse($container->hasDefinition('foo')); + } + protected function process(ContainerBuilder $container) { (new RemoveUnusedDefinitionsPass())->process($container);