From b0925025f8dce5a4b38f9403976c1c6180cf69ff Mon Sep 17 00:00:00 2001 From: Anthony MARTIN Date: Thu, 31 Jan 2019 11:30:51 +0100 Subject: [PATCH] [DependencyInjection] Fix serialization of \Closure in RemoveUnusedDefinitionsPass Signed-off-by: Anthony MARTIN | Q | A | ------------- | --- | Branch? | master | Bug fix? | yes | New feature? | no | BC breaks? | no | Deprecations? | no | Tests pass? | yes | Fixed tickets | #29694 | License | MIT | Doc PR | n/a Fix the issue #29694 --- .../Compiler/RemoveUnusedDefinitionsPass.php | 2 +- .../DependencyInjection/ContainerBuilder.php | 4 ++++ .../RemoveUnusedDefinitionsPassTest.php | 18 ++++++++++++++++++ 3 files changed, 23 insertions(+), 1 deletion(-) diff --git a/src/Symfony/Component/DependencyInjection/Compiler/RemoveUnusedDefinitionsPass.php b/src/Symfony/Component/DependencyInjection/Compiler/RemoveUnusedDefinitionsPass.php index 67d92ca032..287af23b77 100644 --- a/src/Symfony/Component/DependencyInjection/Compiler/RemoveUnusedDefinitionsPass.php +++ b/src/Symfony/Component/DependencyInjection/Compiler/RemoveUnusedDefinitionsPass.php @@ -70,7 +70,7 @@ class RemoveUnusedDefinitionsPass extends AbstractRecursivePass implements Repea 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 25cef99de8..943df8d314 100644 --- a/src/Symfony/Component/DependencyInjection/ContainerBuilder.php +++ b/src/Symfony/Component/DependencyInjection/ContainerBuilder.php @@ -1394,6 +1394,10 @@ class ContainerBuilder extends Container implements TaggedContainerInterface $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 8b92a33e23..b7c98e70d2 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/Compiler/RemoveUnusedDefinitionsPassTest.php +++ b/src/Symfony/Component/DependencyInjection/Tests/Compiler/RemoveUnusedDefinitionsPassTest.php @@ -142,6 +142,24 @@ class RemoveUnusedDefinitionsPassTest extends TestCase $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);