Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit ca69fa3

Browse files
[DI] Warn when a definition relies on a deprecated class in ContainerBuilder::createService()
1 parent b6ab750 commit ca69fa3

File tree

4 files changed

+39
-14
lines changed

4 files changed

+39
-14
lines changed

src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -841,22 +841,29 @@ private function registerAnnotationsConfiguration(array $config, ContainerBuilde
841841
{
842842
$loader->load('annotations.xml');
843843

844-
if ('file' === $config['cache']) {
845-
$cacheDir = $container->getParameterBag()->resolveValue($config['file_cache_dir']);
846-
if (!is_dir($cacheDir) && false === @mkdir($cacheDir, 0777, true) && !is_dir($cacheDir)) {
847-
throw new \RuntimeException(sprintf('Could not create cache directory "%s".', $cacheDir));
844+
if ('none' !== $config['cache']) {
845+
if ('file' === $config['cache']) {
846+
$cacheDir = $container->getParameterBag()->resolveValue($config['file_cache_dir']);
847+
if (!is_dir($cacheDir) && false === @mkdir($cacheDir, 0777, true) && !is_dir($cacheDir)) {
848+
throw new \RuntimeException(sprintf('Could not create cache directory "%s".', $cacheDir));
849+
}
850+
851+
$container
852+
->getDefinition('annotations.php_file_cache')
853+
->replaceArgument(0, $cacheDir)
854+
;
855+
856+
// The annotations.file_cache_reader service is deprecated
857+
$container
858+
->getDefinition('annotations.file_cache_reader')
859+
->replaceArgument(1, $cacheDir)
860+
->replaceArgument(2, $config['debug'])
861+
;
848862
}
849863

850-
$container
851-
->getDefinition('annotations.file_cache_reader')
852-
->replaceArgument(1, $cacheDir)
853-
->replaceArgument(2, $config['debug'])
854-
;
855-
$container->setAlias('annotation_reader', 'annotations.file_cache_reader');
856-
} elseif ('none' !== $config['cache']) {
857864
$container
858865
->getDefinition('annotations.cached_reader')
859-
->replaceArgument(1, new Reference($config['cache']))
866+
->replaceArgument(1, new Reference('file' !== $config['cache'] ? $config['cache'] : 'annotations.php_file_cache'))
860867
->replaceArgument(2, $config['debug'])
861868
;
862869
$container->setAlias('annotation_reader', 'annotations.cached_reader');

src/Symfony/Bundle/FrameworkBundle/Resources/config/annotations.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,12 @@
1919
<argument /><!-- Debug-Flag -->
2020
</service>
2121

22+
<service id="annotations.php_file_cache" class="Doctrine\Common\Cache\PhpFileCache" public="false">
23+
<argument /><!-- Cache-Directory -->
24+
</service>
25+
2226
<service id="annotations.file_cache_reader" class="%annotations.file_cache_reader.class%" public="false">
27+
<deprecated>The "%service_id%" service is deprecated since 2.8 and will be removed in 3.0.</deprecated>
2328
<argument type="service" id="annotations.reader" />
2429
<argument /><!-- Cache-Directory -->
2530
<argument /><!-- Debug Flag -->

src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/FrameworkExtensionTest.php

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -320,8 +320,9 @@ public function testAnnotations()
320320
{
321321
$container = $this->createContainerFromFile('full');
322322

323-
$this->assertEquals($container->getParameter('kernel.cache_dir').'/annotations', $container->getDefinition('annotations.file_cache_reader')->getArgument(1));
324-
$this->assertInstanceOf('Doctrine\Common\Annotations\FileCacheReader', $container->get('annotation_reader'));
323+
$this->assertEquals($container->getParameter('kernel.cache_dir').'/annotations', $container->getDefinition('annotations.php_file_cache')->getArgument(0));
324+
$this->assertSame('annotations.cached_reader', (string) $container->getAlias('annotation_reader'));
325+
$this->assertSame('annotations.php_file_cache', (string) $container->getDefinition('annotations.cached_reader')->getArgument(1));
325326
}
326327

327328
public function testFileLinkFormat()

src/Symfony/Component/DependencyInjection/ContainerBuilder.php

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -899,6 +899,14 @@ public function createService(Definition $definition, $id, $tryProxy = true)
899899
}
900900

901901
$service = call_user_func_array($factory, $arguments);
902+
903+
if (!$definition->isDeprecated() && is_array($factory) && is_string($factory[0])) {
904+
$r = new \ReflectionClass($factory[0]);
905+
906+
if (0 < strpos($r->getDocComment(), "\n * @deprecated ")) {
907+
@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);
908+
}
909+
}
902910
} elseif (null !== $definition->getFactoryMethod(false)) {
903911
if (null !== $definition->getFactoryClass(false)) {
904912
$factory = $parameterBag->resolveValue($definition->getFactoryClass(false));
@@ -913,6 +921,10 @@ public function createService(Definition $definition, $id, $tryProxy = true)
913921
$r = new \ReflectionClass($parameterBag->resolveValue($definition->getClass()));
914922

915923
$service = null === $r->getConstructor() ? $r->newInstance() : $r->newInstanceArgs($arguments);
924+
925+
if (!$definition->isDeprecated() && 0 < strpos($r->getDocComment(), "\n * @deprecated ")) {
926+
@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);
927+
}
916928
}
917929

918930
if ($tryProxy || !$definition->isLazy()) {

0 commit comments

Comments
 (0)