X-Git-Url: https://yaffs.net/gitweb/?a=blobdiff_plain;f=vendor%2Fsymfony%2Fdependency-injection%2FCompiler%2FFactoryReturnTypePass.php;h=825e117ccc0164e4b0a4d7b7864170f8fb831eda;hb=af6d1fb995500ae68849458ee10d66abbdcfb252;hp=e4e64db41bb9eb2ec7ab335536b446db9a5f505d;hpb=9917807b03b64faf00f6a1f29dcb6eafc454efa5;p=yaffs-website diff --git a/vendor/symfony/dependency-injection/Compiler/FactoryReturnTypePass.php b/vendor/symfony/dependency-injection/Compiler/FactoryReturnTypePass.php index e4e64db41..825e117cc 100644 --- a/vendor/symfony/dependency-injection/Compiler/FactoryReturnTypePass.php +++ b/vendor/symfony/dependency-injection/Compiler/FactoryReturnTypePass.php @@ -17,9 +17,21 @@ use Symfony\Component\DependencyInjection\Reference; /** * @author Guilhem N. + * + * @deprecated since version 3.3, to be removed in 4.0. */ class FactoryReturnTypePass implements CompilerPassInterface { + private $resolveClassPass; + + public function __construct(ResolveClassPass $resolveClassPass = null) + { + if (null === $resolveClassPass) { + @trigger_error('The '.__CLASS__.' class is deprecated since Symfony 3.3 and will be removed in 4.0.', E_USER_DEPRECATED); + } + $this->resolveClassPass = $resolveClassPass; + } + /** * {@inheritdoc} */ @@ -29,13 +41,14 @@ class FactoryReturnTypePass implements CompilerPassInterface if (!method_exists(\ReflectionMethod::class, 'getReturnType')) { return; } + $resolveClassPassChanges = null !== $this->resolveClassPass ? $this->resolveClassPass->getChanges() : array(); foreach ($container->getDefinitions() as $id => $definition) { - $this->updateDefinition($container, $id, $definition); + $this->updateDefinition($container, $id, $definition, $resolveClassPassChanges); } } - private function updateDefinition(ContainerBuilder $container, $id, Definition $definition, array $previous = array()) + private function updateDefinition(ContainerBuilder $container, $id, Definition $definition, array $resolveClassPassChanges, array $previous = array()) { // circular reference if (isset($previous[$id])) { @@ -43,7 +56,7 @@ class FactoryReturnTypePass implements CompilerPassInterface } $factory = $definition->getFactory(); - if (null === $factory || null !== $definition->getClass()) { + if (null === $factory || (!isset($resolveClassPassChanges[$id]) && null !== $definition->getClass())) { return; } @@ -51,21 +64,28 @@ class FactoryReturnTypePass implements CompilerPassInterface if (is_string($factory)) { try { $m = new \ReflectionFunction($factory); + if (false !== $m->getFileName() && file_exists($m->getFileName())) { + $container->fileExists($m->getFileName()); + } } catch (\ReflectionException $e) { return; } } else { if ($factory[0] instanceof Reference) { $previous[$id] = true; - $factoryDefinition = $container->findDefinition((string) $factory[0]); - $this->updateDefinition($container, strtolower($factory[0]), $factoryDefinition, $previous); + $factoryId = $container->normalizeId($factory[0]); + $factoryDefinition = $container->findDefinition($factoryId); + $this->updateDefinition($container, $factoryId, $factoryDefinition, $resolveClassPassChanges, $previous); $class = $factoryDefinition->getClass(); } else { $class = $factory[0]; } + if (!$m = $container->getReflectionClass($class, false)) { + return; + } try { - $m = new \ReflectionMethod($class, $factory[1]); + $m = $m->getMethod($factory[1]); } catch (\ReflectionException $e) { return; } @@ -83,6 +103,9 @@ class FactoryReturnTypePass implements CompilerPassInterface } } + if (null !== $returnType && (!isset($resolveClassPassChanges[$id]) || $returnType !== $resolveClassPassChanges[$id])) { + @trigger_error(sprintf('Relying on its factory\'s return-type to define the class of service "%s" is deprecated since Symfony 3.3 and won\'t work in 4.0. Set the "class" attribute to "%s" on the service definition instead.', $id, $returnType), E_USER_DEPRECATED); + } $definition->setClass($returnType); } }