diff --git a/src/Symfony/Component/DependencyInjection/Compiler/AutowirePass.php b/src/Symfony/Component/DependencyInjection/Compiler/AutowirePass.php index 3ae264f5c8bc5..ced4d827dc34d 100644 --- a/src/Symfony/Component/DependencyInjection/Compiler/AutowirePass.php +++ b/src/Symfony/Component/DependencyInjection/Compiler/AutowirePass.php @@ -37,6 +37,7 @@ class AutowirePass extends AbstractRecursivePass private $getPreviousValue; private $decoratedMethodIndex; private $decoratedMethodArgumentIndex; + private $typesClone; public function __construct(bool $throwOnAutowireException = true) { @@ -49,16 +50,16 @@ public function __construct(bool $throwOnAutowireException = true) public function process(ContainerBuilder $container) { try { + $this->typesClone = clone $this; parent::process($container); } finally { - $this->types = null; - $this->ambiguousServiceTypes = null; $this->decoratedClass = null; $this->decoratedId = null; $this->methodCalls = null; $this->getPreviousValue = null; $this->decoratedMethodIndex = null; $this->decoratedMethodArgumentIndex = null; + $this->typesClone = null; } } @@ -375,20 +376,22 @@ private function set(string $type, string $id) private function createTypeNotFoundMessageCallback(TypedReference $reference, $label) { - $container = new ContainerBuilder($this->container->getParameterBag()); - $container->setAliases($this->container->getAliases()); - $container->setDefinitions($this->container->getDefinitions()); - $container->setResourceTracking(false); + if (null === $this->typesClone->container) { + $this->typesClone->container = new ContainerBuilder($this->container->getParameterBag()); + $this->typesClone->container->setAliases($this->container->getAliases()); + $this->typesClone->container->setDefinitions($this->container->getDefinitions()); + $this->typesClone->container->setResourceTracking(false); + } $currentId = $this->currentId; - return function () use ($container, $reference, $label, $currentId) { - return $this->createTypeNotFoundMessage($container, $reference, $label, $currentId); - }; + return (function () use ($reference, $label, $currentId) { + return $this->createTypeNotFoundMessage($reference, $label, $currentId); + })->bindTo($this->typesClone); } - private function createTypeNotFoundMessage(ContainerBuilder $container, TypedReference $reference, $label, string $currentId) + private function createTypeNotFoundMessage(TypedReference $reference, $label, string $currentId) { - if (!$r = $container->getReflectionClass($type = $reference->getType(), false)) { + if (!$r = $this->container->getReflectionClass($type = $reference->getType(), false)) { // either $type does not exist or a parent class does not exist try { $resource = new ClassExistenceResource($type, false); @@ -401,8 +404,8 @@ private function createTypeNotFoundMessage(ContainerBuilder $container, TypedRef $message = sprintf('has type "%s" but this class %s.', $type, $parentMsg ? sprintf('is missing a parent class (%s)', $parentMsg) : 'was not found'); } else { - $alternatives = $this->createTypeAlternatives($container, $reference); - $message = $container->has($type) ? 'this service is abstract' : 'no such service exists'; + $alternatives = $this->createTypeAlternatives($this->container, $reference); + $message = $this->container->has($type) ? 'this service is abstract' : 'no such service exists'; $message = sprintf('references %s "%s" but %s.%s', $r->isInterface() ? 'interface' : 'class', $type, $message, $alternatives); if ($r->isInterface() && !$alternatives) {