8000 bug #21339 [FrameworkBundle] CachePoolClearerPass fails if "cache.ann… · symfony/symfony@2708b19 · GitHub
[go: up one dir, main page]

Skip to content

Commit 2708b19

Browse files
author
Antanas Arvasevicius
committed
bug #21339 [FrameworkBundle] CachePoolClearerPass fails if "cache.annotations" service is created
1 parent 922b7c1 commit 2708b19

File tree

7 files changed

+148
-18
lines changed

7 files changed

+148
-18
lines changed
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
<?php
2+
3+
/*
4+
* This file is part of the Symfony package.
5+
*
6+
* (c) Fabien Potencier <fabien@symfony.com>
7+
*
8+
* For the full copyright and license information, please view the LICENSE
9+
* file that was distributed with this source code.
10+
*/
11+
12+
namespace Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler;
13+
14+
use Symfony\Component\Cache\Adapter\AbstractAdapter;
15+
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
16+
use Symfony\Component\DependencyInjection\ContainerBuilder;
17+
use Symfony\Component\DependencyInjection\Reference;
18+
19+
final class CacheAnnotationsMonologInjectorPass implements CompilerPassInterface
20+
{
21+
/**
22+
* {@inheritdoc}
23+
*/
24+
public function process(ContainerBuilder $container)
25+
{
26+
if (!($container->hasDefinition('cache.annotations') || $container->hasAlias('cache.annotations'))) {
27+
return;
28+
}
29+
$factory = array(AbstractAdapter::class, 'createSystemCache');
30+
$annotationsPool = $container->findDefinition('cache.annotations');
31+
if ($factory !== $annotationsPool->getFactory() || 4 !== count($annotationsPool->getArguments())) {
32+
return;
33+
}
34+
if ($container->has('monolog.logger.cache')) {
35+
$annotationsPool->addArgument(new Reference('monolog.logger.cache'));
36+
} elseif ($container->hasDefinition('cache.system')) {
37+
$systemPool = $container->getDefinition('cache.system');
38+
if ($factory === $systemPool->getFactory() && 5 <= count($systemArgs = $systemPool->getArguments())) {
39+
$annotationsPool->addArgument($systemArgs[4]);
40+
}
41+
}
42+
}
43+
}

src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Compiler/CachePoolClearerPass.php

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111

1212
namespace Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler;
1313

14-
use Symfony\Component\Cache\Adapter\AbstractAdapter;
1514
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
1615
use Symfony\Component\DependencyInjection\ContainerBuilder;
1716
use Symfony\Component\DependencyInjection\Reference;
@@ -39,22 +38,5 @@ public function process(ContainerBuilder $container)
3938
}
4039
}
4140
}
42-
43-
if (!$container->has('cache.annotations')) {
44-
return;
45-
}
46-
$factory = array(AbstractAdapter::class, 'createSystemCache');
47-
$annotationsPool = $container->getDefinition('cache.annotations');
48-
if ($factory !== $annotationsPool->getFactory() || 4 !== count($annotationsPool->getArguments())) {
49-
return;
50-
}
51-
if ($container->has('monolog.logger.cache')) {
52-
$annotationsPool->addArgument(new Reference('monolog.logger.cache'));
53-
} elseif ($container->has('cache.system')) {
54-
$systemPool = $container->getDefinition('cache.system');
55-
if ($factory === $systemPool->getFactory() && 5 <= count($systemArgs = $systemPool->getArguments())) {
56-
$annotationsPool->addArgument($systemArgs[4]);
57-
}
58-
}
5941
}
6042
}

src/Symfony/Bundle/FrameworkBundle/FrameworkBundle.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
use Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\AddDebugLogProcessorPass;
1616
use Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\AddValidatorInitializersPass;
1717
use Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\AddConsoleCommandPass;
18+
use Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\CacheAnnotationsMonologInjectorPass;
1819
use Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\CachePoolPass;
1920
use Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\CachePoolClearerPass;
2021
use Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\ControllerArgumentValueResolverPass;
@@ -96,6 +97,7 @@ public function build(ContainerBuilder $container)
9697
$container->addCompilerPass(new CachePoolPass(), PassConfig::TYPE_BEFORE_OPTIMIZATION, 32);
9798
$container->addCompilerPass(new ValidateWorkflowsPass());
9899
$container->addCompilerPass(new CachePoolClearerPass(), PassConfig::TYPE_AFTER_REMOVING);
100+
$container->addCompilerPass(new CacheAnnotationsMonologInjectorPass(), PassConfig::TYPE_BEFORE_REMOVING, 32);
99101

100102
if ($container->getParameter('kernel.debug')) {
101103
$container->addCompilerPass(new AddDebugLogProcessorPass(), PassConfig::TYPE_BEFORE_OPTIMIZATION, -32);

src/Symfony/Bundle/FrameworkBundle/Tests/Functional/ContainerDumpTest.php

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,4 +29,15 @@ public function testContainerCompilation()
2929

3030
$this->assertTrue($client->getContainer()->has('serializer'));
3131
}
32+
33+
/**
34+
* @see https://github.com/symfony/symfony/issues/21339
35+
*/
36+
public function testContainerCompilationErrorDueCachePoolClearerPassBug()
37+
{
38+
$client = $this->createClient(array('test_case' => 'ContainerDumpCacheAnnotationsBug', 'root_config' => 'config.yml', 'debug' => true));
39+
40+
$this->assertTrue($client->getContainer()->has('serializer'));
41+
}
42+
3243
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
<?php
2+
3+
/*
4+
* This file is part of the Symfony package.
5+
*
6+
* (c) Fabien Potencier <fabien@symfony.com>
7+
*
8+
* For the full copyright and license information, please view the LICENSE
9+
* file that was distributed with this source code.
10+
*/
11+
12+
namespace Symfony\Bundle\FrameworkBundle\Tests\Functional\app\ContainerDumpCacheAnnotationsBug;
13+
14+
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
15+
use Symfony\Component\DependencyInjection\Compiler\PassConfig;
16+
use Symfony\Component\DependencyInjection\ContainerBuilder;
17+
use Symfony\Component\DependencyInjection\Reference;
18+
use Symfony\Component\HttpKernel\Bundle\Bundle;
19+
20+
class BeforeOptimizationCompilerPass implements CompilerPassInterface {
21+
public function process(ContainerBuilder $container)
22+
{
23+
// force to use service in compiler pass which does DiExtraBundle
24+
$container->get('cache.annotations');
25+
}
26+
}
27+
28+
/**
29+
* Emulate CacheCollectorPass which aliasias cache.annotations service (used in debug mode)
30+
* @see src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Compiler/CacheCollectorPass.php:24
31+
*/
32+
class CacheCollectorEmulationPass implements CompilerPassInterface {
33+
public function process(ContainerBuilder $container)
34+
{
35+
$id = 'cache.annotations';
36+
37+
$container->register($id.'.recorder', 'stdObject')
38+
->setDecoratedService($id)
39+
->addArgument(new Reference($id.'.recorder.inner'))
40+
->setPublic(false);
41+
}
42+
}
43+
44+
class SetupBundle extends Bundle
45+
{
46+
public function build(ContainerBuilder $container)
47+
{
48+
$container->addCompilerPass(new BeforeOptimizationCompilerPass(), PassConfig::TYPE_BEFORE_OPTIMIZATION);
49+
$container->addCompilerPass(new CacheCollectorEmulationPass());
50+
}
51+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
<?php
2+
3+
/*
4+
* This file is part of the Symfony package.
5+
*
6+
* (c) Fabien Potencier <fabien@symfony.com>
7+
*
8+
* For the full copyright and license information, please view the LICENSE
9+
* file that was distributed with this source code.
10+
*/
11+
12+
use Symfony\Bundle\FrameworkBundle\Tests\Functional\app\ContainerDumpCacheAnnotationsBug\SetupBundle;
13+
use Symfony\Bundle\FrameworkBundle\Tests\Functional\Bundle\TestBundle\TestBundle;
14+
use Symfony\Bundle\FrameworkBundle\FrameworkBundle;
15+
16+
return array(
17+
new FrameworkBundle(),
18+
new TestBundle(),
19+
new SetupBundle()
20+
);
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
imports:
2+
- { resource: ../config/default.yml }
3+
4+
framework:
5+
esi: true
6+
ssi: true
7+
fragments: true
8+
profiler: true
9+
router: true
10+
session: true
11+
request: true
12+
templating:
13+
enabled: true
14+
engines: ['php']
15+
assets: true
16+
translator: true
17+
validation: true
18+
serializer: true
19+
property_info: true
20+
csrf_protection: true
21+
form: true

0 commit comments

Comments
 (0)
0