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 1ccb2188d757a..e513792a3d285 100644 --- a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php +++ b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php @@ -841,22 +841,29 @@ private function registerAnnotationsConfiguration(array $config, ContainerBuilde { $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 1c0c312dc2673..67abfeae322e1 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 ad0c427100ddf..9bda7ae1eef75 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/FrameworkExtensionTest.php +++ b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/FrameworkExtensionTest.php @@ -320,8 +320,9 @@ public function testAnnotations() { $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 0f893e66e9885..76b7bf3c2cd61 100644 --- a/src/Symfony/Component/DependencyInjection/ContainerBuilder.php +++ b/src/Symfony/Component/DependencyInjection/ContainerBuilder.php @@ -899,6 +899,14 @@ public function createService(Definition $definition, $id, $tryProxy = true) } $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 @@ public function createService(Definition $definition, $id, $tryProxy = true) $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()) { pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy