8000 [FrameworkBundle] use abstract cache.pool decoration and aliases · symfony/symfony@fe5009c · GitHub
[go: up one dir, main page]

Skip to content

Commit fe5009c

Browse files
[FrameworkBundle] use abstract cache.pool decoration and aliases
1 parent 15dc36d commit fe5009c

File tree

10 files changed

+70
-104
lines changed

10 files changed

+70
-104
lines changed

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

Lines changed: 6 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -26,34 +26,18 @@ class CachePoolPass implements CompilerPassInterface
2626
public function process(ContainerBuilder $container)
2727
{
2828
foreach ($container->findTaggedServiceIds('cache.pool') as $id => $tags) {
29-
$pool = $container->getDefinition($id);
29+
$adapter = $pool = $container->getDefinition($id);
3030

31-
if (!$pool instanceof DefinitionDecorator) {
32-
throw new \InvalidArgumentException(sprintf('Services tagged with "cache.pool" must have a parent service but "%s" has none.', $id));
31+
while (!isset($tags[0]['namespace_arg_index']) && $adapter instanceof DefinitionDecorator) {
32+
$adapter = $container->findDefinition($adapter->getParent());
33+
$tags = $adapter->getTag('cache.pool');
3334
}
3435

35-
$adapter = $pool;
36-
37-
do {
38-
$adapterId = $adapter->getParent();
39-
$adapter = $container->getDefinition($adapterId);
40-
} while ($adapter instanceof DefinitionDecorator && !$adapter->hasTag('cache.adapter'));
41-
42-
if (!$adapter->hasTag('cache.adapter')) {
43-
throw new \InvalidArgumentException(sprintf('Services tagged with "cache.pool" must have a parent service tagged with "cache.adapter" but "%s" has none.', $id));
44-
}
45-
46-
$tags = $adapter->getTag('cache.adapter');
47-
4836
if (!isset($tags[0]['namespace_arg_index'])) {
49-
throw new \InvalidArgumentException(sprintf('Invalid "cache.adapter" tag for service "%s": attribute "namespace_arg_index" is missing.', $adapterId));
50-
}
51-
52-
if (!$adapter->isAbstract()) {
53-
throw new \InvalidArgumentException(sprintf('Services tagged as "cache.adapter" must be abstract: "%s" is not.', $adapterId));
37+
throw new \InvalidArgumentException(sprintf('Invalid "cache.pool" tag for service "%s": attribute "namespace_arg_index" is missing.', $id));
5438
}
5539

56-
if (0 <= $namespaceArgIndex = $tags[0]['namespace_arg_index']) {
40+
if (!$pool->isAbstract() && 0 <= $namespaceArgIndex = $tags[0]['namespace_arg_index']) {
5741
$pool->replaceArgument($namespaceArgIndex, $this->getNamespace($id));
5842
}
5943
}

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

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -561,15 +561,21 @@ private function addCacheSection(ArrayNodeDefinition $rootNode)
561561
->useAttributeAsKey('name')
562562
->prototype('array')
563563
->children()
564-
->enumNode('type')
565-
->info('The cache pool type (one of "apcu", "doctrine", "psr6" or "filesystem")')
564+
->scalarNode('type')
565+
->info('The cache pool type (one of "default", "apcu", "doctrine", "psr6", "filesystem" or any other existing pool name.)')
566566
->isRequired()
567-
->values(array('apcu', 'doctrine', 'psr6', 'filesystem'))
568567
->end()
569-
->integerNode('default_lifetime')->defaultValue(0)->end()
570-
->scalarNode('cache_provider_service')->defaultNull()->end()
568+
->booleanNode('public')->defaultFalse()->end()
569+
->integerNode('default_lifetime')->defaultNull()->end()
570+
->scalarNode('provider_service')->defaultNull()->end()
571571
->scalarNode('directory')->defaultNull()->end()
572572
->end()
573+
->validate()
574+
->ifTrue(function ($v) {
575+
return isset($v['provider_service']) xor in_array($v['type'], array('psr6', 'doctrine'));
576+
})
577+
->thenInvalid('You must use "provider_service" with (and only with) cache types "psr6" or "doctrine".')
578+
->end()
573579
->end()
574580
->end()
575581
->end()

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

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1023,16 +1023,24 @@ private function registerPropertyInfoConfiguration(array $config, ContainerBuild
10231023
private function registerCacheConfiguration(array $config, ContainerBuilder $container, XmlFileLoader $loader)
10241024
{
10251025
if (!empty($config['pools'])) {
1026-
$loader->load('cache_adapters.xml');
1026+
$loader->load('cache_pools.xml');
10271027
}
10281028

10291029
foreach ($config['pools'] as $name => $poolConfig) {
1030-
$poolDefinition = new DefinitionDecorator('cache.adapter.'.$poolConfig['type']);
1031-
$poolDefinition->replaceArgument(1, $poolConfig['default_lifetime']);
1030+
$type = $poolConfig['type'];
1031+
if (!isset($config['pools'][$type]) && !$container->has('cache.pool.'.$type)) {
1032+
throw new \UnexpectedValueException(sprintf('Cache pool "%s" is of undefined type "%s".', $name, $type));
1033+
}
1034+
$poolDefinition = new DefinitionDecorator('cache.pool.'.$type);
1035+
$poolDefinition->setPublic($poolConfig['public']);
1036+
1037+
if (isset($poolConfig['default_lifetime'])) {
1038+
$poolDefinition->replaceArgument(1, $poolConfig['default_lifetime']);
1039+
}
10321040

1033-
if ('doctrine' === $poolConfig['type'] || 'psr6' === $poolConfig['type']) {
1034-
$poolDefinition->replaceArgument(0, new Reference($poolConfig['cache_provider_service']));
1035-
} elseif ('filesystem' === $poolConfig['type'] && isset($poolConfig['directory'][0])) {
1041+
if ('doctrine' === $type || 'psr6' === $type) {
1042+
$poolDefinition->replaceArgument(0, new Reference($poolConfig['provider_service']));
1043+
} elseif ('filesystem' === $type && isset($poolConfig['directory'][0])) {
10361044
$poolDefinition->replaceArgument(0, $poolConfig['directory']);
10371045
}
10381046

src/Symfony/Bundle/FrameworkBundle/Resources/config/cache_adapters.xml renamed to src/Symfony/Bundle/FrameworkBundle/Resources/config/cache_pools.xml

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,28 +6,30 @@
66

77
<services>
88

9-
<service id="cache.adapter.apcu" class="Symfony\Component\Cache\Adapter\ApcuAdapter" abstract="true">
10-
<tag name="cache.adapter" namespace-arg-index="0" />
9+
<service id="cache.pool.default" alias="cache.pool.filesystem" />
10+
11+
<service id="cache.pool.apcu" class="Symfony\Component\Cache\Adapter\ApcuAdapter" abstract="true">
12+
<tag name="cache.pool" namespace-arg-index="0" />
1113
<argument /> <!-- namespace -->
1214
<argument /> <!-- default lifetime -->
1315
</service>
1416

15-
<service id="cache.adapter.doctrine" class="Symfony\Component\Cache\Adapter\DoctrineAdapter" abstract="true">
16-
<tag name="cache.adapter" namespace-arg-index="2" />
17+
<service id="cache.pool.doctrine" class="Symfony\Component\Cache\Adapter\DoctrineAdapter" abstract="true">
18+
<tag name="cache.pool" namespace-arg-index="2" />
1719
<argument /> <!-- doctrine provider service -->
1820
<argument /> <!-- default lifetime -->
1921
<argument /> <!-- namespace -->
2022
</service>
2123

22-
<service id="cache.adapter.psr6" class="Symfony\Component\Cache\Adapter\ProxyAdapter" abstract="true">
23-
<tag name="cache.adapter" namespace-arg-index="2" />
24+
<service id="cache.pool.psr6" class="Symfony\Component\Cache\Adapter\ProxyAdapter" abstract="true">
25+
<tag name="cache.pool" namespace-arg-index="2" />
2426
<argument /> <!-- PSR-6 provider service -->
2527
<argument /> <!-- default lifetime -->
2628
<argument /> <!-- namespace -->
2729
</service>
2830

29-
<service id="cache.adapter.filesystem" class="Symfony\Component\Cache\Adapter\FilesystemAdapter" abstract="true">
30-
<tag name="cache.adapter" namespace-arg-index="2" />
31+
<service id="cache.pool.filesystem" class="Symfony\Component\Cache\Adapter\FilesystemAdapter" abstract="true">
32+
<tag name="cache.pool" namespace-arg-index="2" />
3133
<argument>%kernel.cache_dir%</argument>
3234
<argument /> <!-- default lifetime -->
3335
<argument /> <!-- namespace -->

src/Symfony/Bundle/FrameworkBundle/Resources/config/schema/symfony-1.0.xsd

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -213,8 +213,9 @@
213213
<xsd:complexType name="cache_pool">
214214
<xsd:attribute name="name" type="xsd:string" use="required" />
215215
<xsd:attribute name="type" type="xsd:string" use="required" />
216+
<xsd:attribute name="public" type="xsd:boolean" />
216217
<xsd:attribute name="default-lifetime" type="xsd:integer" />
217-
<xsd:attribute name="cache-provider-service" type="xsd:string" />
218+
<xsd:attribute name="provider-service" type="xsd:string" />
218219
<xsd:attribute name="directory" type="xsd:string" />
219220
</xsd:complexType>
220221
</xsd:schema>

src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Compiler/CachePoolPassTest.php

Lines changed: 5 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,10 @@ public function testNamespaceArgumentIsReplaced()
3030
$container = new ContainerBuilder();
3131
$adapter = new Definition();
3232
$adapter->setAbstract(true);
33-
$adapter->addTag('cache.adapter', array('namespace_arg_index' => 0));
33+
$adapter->addTag('cache.pool', array('namespace_arg_index' => 0));
3434
$container->setDefinition('app.cache_adapter', $adapter);
35-
$cachePool = new DefinitionDecorator('app.cache_adapter');
35+
$container->setAlias('app.cache_adapter_alias', 'app.cache_adapter');
36+
$cachePool = new DefinitionDecorator('app.cache_adapter_alias');
3637
$cachePool->addArgument(null);
3738
$cachePool->addTag('cache.pool');
3839
$container->setDefinition('app.cache_pool', $cachePool);
@@ -44,60 +45,14 @@ public function testNamespaceArgumentIsReplaced()
4445

4546
/**
4647
* @expectedException \InvalidArgumentException
47-
* @expectedExceptionMessage Services tagged with "cache.pool" must have a parent service but "app.cache_pool" has none.
48-
*/
49-
public function testThrowsExceptionWhenCachePoolHasNoParentDefinition()
50-
{
51-
$container = new ContainerBuilder();
52-
$cachePool = new Definition();
53-
$cachePool->addTag('cache.pool');
54-
$container->setDefinition('app.cache_pool', $cachePool);
55-
56-
$this->cachePoolPass->process($container);
57-
}
58-
59-
/**
60-
* @expectedException \InvalidArgumentException
61-
* @expectedExceptionMessage Services tagged with "cache.pool" must have a parent service tagged with "cache.adapter" but "app.cache_pool" has none.
62-
*/
63-
public function testThrowsExceptionWhenCachePoolIsNotBasedOnAdapter()
64-
{
65-
$container = new ContainerBuilder();
66-
$container->register('app.cache_adapter');
67-
$cachePool = new DefinitionDecorator('app.cache_adapter');
68-
$cachePool->addTag('cache.pool');
69-
$container->setDefinition('app.cache_pool', $cachePool);
70-
71-
$this->cachePoolPass->process($container);
72-
}
73-
74-
/**
75-
* @expectedException \InvalidArgumentException
76-
* @expectedExceptionMessage Invalid "cache.adapter" tag for service "app.cache_adapter": attribute "namespace_arg_index" is missing.
48+
* @expectedExceptionMessage Invalid "cache.pool" tag for service "app.cache_adapter": attribute "namespace_arg_index" is missing.
7749
*/
7850
public function testThrowsExceptionWhenCacheAdapterDefinesNoNamespaceArgument()
7951
{
8052
$container = new ContainerBuilder();
8153
$adapter = new Definition();
8254
$adapter->setAbstract(true);
83-
$adapter->addTag('cache.adapter');
84-
$container->setDefinition('app.cache_adapter', $adapter);
85-
$cachePool = new DefinitionDecorator('app.cache_adapter');
86-
$cachePool->addTag('cache.pool');
87-
$container->setDefinition('app.cache_pool', $cachePool);
88-
89-
$this->cachePoolPass->process($container);
90-
}
91-
92-
/**
93-
* @expectedException \InvalidArgumentException
94-
* @expectedExceptionMessage Services tagged as "cache.adapter" must be abstract: "app.cache_adapter" is not.
95-
*/
96-
public function testThrowsExceptionWhenCacheAdapterIsNotAbstract()
97-
{
98-
$container = new ContainerBuilder();
99-
$adapter = new Definition();
100-
$adapter->addTag('cache.adapter', array('namespace_arg_index' => 0));
55+
$adapter->addTag('cache.pool');
10156
$container->setDefinition('app.cache_adapter', $adapter);
10257
$cachePool = new DefinitionDecorator('app.cache_adapter');
10358
$cachePool->addTag('cache.pool');

src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/php/cache.php

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
'bar' => array(
1111
'type' => 'doctrine',
1212
'default_lifetime' => 5,
13-
'cache_provider_service' => 'app.doctrine_cache_provider',
13+
'provider_service' => 'app.doctrine_cache_provider',
1414
),
1515
'baz' => array(
1616
'type' => 'filesystem',
@@ -20,7 +20,11 @@
2020
'foobar' => array(
2121
'type' => 'psr6',
2222
'default_lifetime' => 10,
23-
'cache_provider_service' => 'app.cache_pool',
23+
'provider_service' => 'app.cache_pool',
24+
),
25+
'def' => array(
26+
'type' => 'default',
27+
'default_lifetime' => 11,
2428
),
2529
),
2630
),

src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/xml/cache.xml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,10 @@
88
<framework:config>
99
<framework:cache>
1010
<framework:pool name="foo" type="apcu" default-lifetime="30" />
11-
<framework:pool name="bar" type="doctrine" default-lifetime="5" cache-provider-service="app.doctrine_cache_provider" />
11+
<framework:pool name="bar" type="doctrine" default-lifetime="5" provider-service="app.doctrine_cache_provider" />
1212
<framework:pool name="baz" type="filesystem" default-lifetime="7" directory="app/cache/psr" />
13-
<framework:pool name="foobar" type="psr6" default-lifetime="10" cache-provider-service="app.cache_pool" />
13+
<framework:pool name="foobar" type="psr6" default-lifetime="10" provider-service="app.cache_pool" />
14+
<framework:pool name="def" type="default" default-lifetime="11" />
1415
</framework:cache>
1516
</framework:config>
1617
</container>

src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/yml/cache.yml

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,15 @@ framework:
77
bar:
88
type: doctrine
99
default_lifetime: 5
10-
cache_provider_service: app.doctrine_cache_provider
10+
provider_service: app.doctrine_cache_provider
1111
baz:
1212
type: filesystem
1313
default_lifetime: 7
1414
directory: app/cache/psr
1515
foobar:
1616
type: psr6
1717
default_lifetime: 10
18-
cache_provider_service: app.cache_pool
18+
provider_service: app.cache_pool
19+
def:
20+
type: default
21+
default_lifetime: 11

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

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -579,6 +579,7 @@ public function testCachePoolServices()
579579
$this->assertCachePoolServiceDefinitionIsCreated($container, 'bar', 'doctrine', array('index_0' => new Reference('app.doctrine_cache_provider'), 'index_1' => 5));
580580
$this->assertCachePoolServiceDefinitionIsCreated($container, 'baz', 'filesystem', array('index_0' => 'app/cache/psr', 'index_1' => 7));
581581
$this->assertCachePoolServiceDefinitionIsCreated($container, 'foobar', 'psr6', array('index_0' => new Reference('app.cache_pool'), 'index_1' => 10));
582+
$this->assertCachePoolServiceDefinitionIsCreated($container, 'def', 'filesystem', array('index_1' => 11));
582583
}
583584

584585
protected function createContainer(array $data = array())
@@ -658,10 +659,10 @@ private function assertCachePoolServiceDefinitionIsCreated(ContainerBuilder $con
658659

659660
$poolDefinition = $container->getDefinition($id);
660661

661-
$this->assertInstanceOf(DefinitionDecorator::class, $poolDefinition, sprintf('Cache pool "%s" is based on an abstract cache adapter.', $name));
662+
$this->assertInstanceOf(DefinitionDecorator::class, $poolDefinition, sprintf('Cache pool "%s" is based on an abstract cache pool.', $name));
662663
$this->assertEquals($arguments, $poolDefinition->getArguments());
663664

664-
$adapterDefinition = $container->getDefinition($poolDefinition->getParent());
665+
$adapterDefinition = $container->findDefinition($poolDefinition->getParent());
665666

666667
switch ($type) {
667668
case 'apcu':
@@ -675,13 +676,14 @@ private function assertCachePoolServiceDefinitionIsCreated(ContainerBuilder $con
675676
break;
676677
}
677678

678-
$this->assertTrue($adapterDefinition->hasTag('cache.adapter'), sprintf('Service definition "%s" is tagged with the "cache.adapter" tag.', $id));
679+
$this->assertTrue($adapterDefinition->hasTag('cache.pool'), sprintf('Service definition "%s" is tagged with the "cache.pool" tag.', $id));
680+
$this->assertTrue($adapterDefinition->isAbstract(), sprintf('Service definition "%s" is abstract.', $id));
679681

680-
$tag = $adapterDefinition->getTag('cache.adapter');
682+
$tag = $adapterDefinition->getTag('cache.pool');
681683

682684
if (null !== $namespaceArgumentIndex) {
683-
$this->assertTrue(isset($tag[0]['namespace-arg-index']), 'The namespace argument index is given by the "namespace-arg-index" attribute of the "cache.adapter" tag.');
684-
$this->assertSame($namespaceArgumentIndex, $tag[0]['namespace-arg-index'], 'The namespace argument index is given by the "namespace-arg-index" attribute of the "cache.adapter" tag.');
685+
$this->assertTrue(isset($tag[0]['namespace-arg-index']), 'The namespace argument index is given by the "namespace-arg-index" attribute of the "cache.pool" tag.');
686+
$this->assertSame($namespaceArgumentIndex, $tag[0]['namespace-arg-index'], 'The namespace argument index is given by the "namespace-arg-index" attribute of the "cache.pool" tag.');
685687
}
686688
}
687689
}

0 commit comments

Comments
 (0)
0