From ca69fa340c97e5ffc3287ca4e4c4574690dc2847 Mon Sep 17 00:00:00 2001 From: Nicolas Grekas Date: Tue, 29 Sep 2015 15:40:49 +0200 Subject: [PATCH] [DI] Warn when a definition relies on a deprecated class in ContainerBuilder::createService() --- .../FrameworkExtension.php | 31 ++++++++++++------- .../Resources/config/annotations.xml | 5 +++ .../FrameworkExtensionTest.php | 5 +-- .../DependencyInjection/ContainerBuilder.php | 12 +++++++ 4 files changed, 39 insertions(+), 14 deletions(-) diff --git a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php index 1ccb2188d7..e513792a3d 100644 --- a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php +++ b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php @@ -841,22 +841,29 @@ class FrameworkExtension extends Extension { $loader->load('annotations.xml'); - if ('file' === $config['cache']) { - $cacheDir = $container->getParameterBag()->resolveValue($config['file_cache_dir']); - if (!is_dir($cacheDir) && false === @mkdir($cacheDir, 0777, true) && !is_dir($cacheDir)) { - throw new \RuntimeException(sprintf('Could not create cache directory "%s".', $cacheDir)); + if ('none' !== $config['cache']) { + if ('file' === $config['cache']) { + $cacheDir = $container->getParameterBag()->resolveValue($config['file_cache_dir']); + if (!is_dir($cacheDir) && false === @mkdir($cacheDir, 0777, true) && !is_dir($cacheDir)) { + throw new \RuntimeException(sprintf('Could not create cache directory "%s".', $cacheDir)); + } + + $container + ->getDefinition('annotations.php_file_cache') + ->replaceArgument(0, $cacheDir) + ; + + // The annotations.file_cache_reader service is deprecated + $container + ->getDefinition('annotations.file_cache_reader') + ->replaceArgument(1, $cacheDir) + ->replaceArgument(2, $config['debug']) + ; } - $container - ->getDefinition('annotations.file_cache_reader') - ->replaceArgument(1, $cacheDir) - ->replaceArgument(2, $config['debug']) - ; - $container->setAlias('annotation_reader', 'annotations.file_cache_reader'); - } elseif ('none' !== $config['cache']) { $container ->getDefinition('annotations.cached_reader') - ->replaceArgument(1, new Reference($config['cache'])) + ->replaceArgument(1, new Reference('file' !== $config['cache'] ? $config['cache'] : 'annotations.php_file_cache')) ->replaceArgument(2, $config['debug']) ; $container->setAlias('annotation_reader', 'annotations.cached_reader'); diff --git a/src/Symfony/Bundle/FrameworkBundle/Resources/config/annotations.xml b/src/Symfony/Bundle/FrameworkBundle/Resources/config/annotations.xml index 1c0c312dc2..67abfeae32 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Resources/config/annotations.xml +++ b/src/Symfony/Bundle/FrameworkBundle/Resources/config/annotations.xml @@ -19,7 +19,12 @@ + + + + + The "%service_id%" service is deprecated since 2.8 and will be removed in 3.0. diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/FrameworkExtensionTest.php b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/FrameworkExtensionTest.php index ad0c427100..9bda7ae1ee 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/FrameworkExtensionTest.php +++ b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/FrameworkExtensionTest.php @@ -320,8 +320,9 @@ abstract class FrameworkExtensionTest extends TestCase { $container = $this->createContainerFromFile('full'); - $this->assertEquals($container->getParameter('kernel.cache_dir').'/annotations', $container->getDefinition('annotations.file_cache_reader')->getArgument(1)); - $this->assertInstanceOf('Doctrine\Common\Annotations\FileCacheReader', $container->get('annotation_reader')); + $this->assertEquals($container->getParameter('kernel.cache_dir').'/annotations', $container->getDefinition('annotations.php_file_cache')->getArgument(0)); + $this->assertSame('annotations.cached_reader', (string) $container->getAlias('annotation_reader')); + $this->assertSame('annotations.php_file_cache', (string) $container->getDefinition('annotations.cached_reader')->getArgument(1)); } public function testFileLinkFormat() diff --git a/src/Symfony/Component/DependencyInjection/ContainerBuilder.php b/src/Symfony/Component/DependencyInjection/ContainerBuilder.php index 0f893e66e9..76b7bf3c2c 100644 --- a/src/Symfony/Component/DependencyInjection/ContainerBuilder.php +++ b/src/Symfony/Component/DependencyInjection/ContainerBuilder.php @@ -899,6 +899,14 @@ class ContainerBuilder extends Container implements TaggedContainerInterface } $service = call_user_func_array($factory, $arguments); + + if (!$definition->isDeprecated() && is_array($factory) && is_string($factory[0])) { + $r = new \ReflectionClass($factory[0]); + + if (0 < strpos($r->getDocComment(), "\n * @deprecated ")) { + @trigger_error(sprintf('The "%s" service relies on the deprecated "%s" factory class. It should either be deprecated or its factory upgraded.', $id, $r->name), E_USER_DEPRECATED); + } + } } elseif (null !== $definition->getFactoryMethod(false)) { if (null !== $definition->getFactoryClass(false)) { $factory = $parameterBag->resolveValue($definition->getFactoryClass(false)); @@ -913,6 +921,10 @@ class ContainerBuilder extends Container implements TaggedContainerInterface $r = new \ReflectionClass($parameterBag->resolveValue($definition->getClass())); $service = null === $r->getConstructor() ? $r->newInstance() : $r->newInstanceArgs($arguments); + + if (!$definition->isDeprecated() && 0 < strpos($r->getDocComment(), "\n * @deprecated ")) { + @trigger_error(sprintf('The "%s" service relies on the deprecated "%s" class. It should either be deprecated or its implementation upgraded.', $id, $r->name), E_USER_DEPRECATED); + } } if ($tryProxy || !$definition->isLazy()) {