Skip to content

Commit 771b25b

Browse files
tgalopinnicolas-grekas
authored andcommitted
[FrameworkBundle] Add cache adapters in semantic configuration
1 parent 8e31c59 commit 771b25b

File tree

10 files changed

+124
-31
lines changed

10 files changed

+124
-31
lines changed

DependencyInjection/Compiler/CachePoolPass.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,13 +44,15 @@ public function process(ContainerBuilder $container)
4444
if ($pool->isAbstract()) {
4545
continue;
4646
}
47-
$tags[0]['namespace'] = $this->getNamespace($namespaceSuffix, isset($tags[0]['namespace']) ? $tags[0]['namespace'] : $id);
4847
while ($adapter instanceof DefinitionDecorator) {
4948
$adapter = $container->findDefinition($adapter->getParent());
5049
if ($t = $adapter->getTag('cache.pool')) {
5150
$tags[0] += $t[0];
5251
}
5352
}
53+
if (!isset($tags[0]['namespace'])) {
54+
$tags[0]['namespace'] = $this->getNamespace($namespaceSuffix, $id);
55+
}
5456
if (isset($tags[0]['clearer'])) {
5557
$clearer = $container->getDefinition($tags[0]['clearer']);
5658
} else {

DependencyInjection/Configuration.php

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -557,27 +557,37 @@ private function addCacheSection(ArrayNodeDefinition $rootNode)
557557
->info('Cache configuration')
558558
->addDefaultsIfNotSet()
559559
->fixXmlConfig('pool')
560+
->fixXmlConfig('adapter')
560561
->children()
561-
->arrayNode('pools')
562+
->arrayNode('adapters')
562563
->useAttributeAsKey('name')
563564
->prototype('array')
564565
->children()
565-
->scalarNode('adapter')
566-
->info('The cache pool adapter service to use as template definition.')
567-
->defaultValue('cache.adapter.shared')
566+
->scalarNode('parent')
567+
->isRequired()
568+
->info('The parent cache adapter service.')
568569
->end()
569-
->booleanNode('public')->defaultFalse()->end()
570570
->integerNode('default_lifetime')->end()
571571
->scalarNode('provider')
572-
->info('The service name to use as provider when the specified adapter needs one.')
573-
->end()
574-
->scalarNode('namespace')
575-
->info('The namespace where cached items are stored. Auto-generated by default. Set to false to disable namespacing.')
572+
->info('The service name to use as provider when the specified parent adapter needs one.')
576573
->end()
577574
->scalarNode('clearer')->defaultValue('cache.default_pools_clearer')->end()
578575
->end()
579576
->end()
580577
->end()
578+
->arrayNode('pools')
579+
->useAttributeAsKey('name')
580+
->prototype('array')
581+
->children()
582+
->scalarNode('adapter')
583+
->info('The cache adapter service to use as template definition.')
584+
->defaultValue('cache.adapter.shared')
585+
->end()
586+
->booleanNode('public')->defaultTrue()->end()
587+
->integerNode('default_lifetime')->end()
588+
->end()
589+
->end()
590+
->end()
581591
->end()
582592
->end()
583593
->end()

DependencyInjection/FrameworkExtension.php

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1037,6 +1037,15 @@ private function registerPropertyInfoConfiguration(array $config, ContainerBuild
10371037

10381038
private function registerCacheConfiguration(array $config, ContainerBuilder $container, XmlFileLoader $loader)
10391039
{
1040+
foreach ($config['adapters'] as $name => $adapterConfig) {
1041+
$adapterDefinition = new DefinitionDecorator($adapterConfig['parent']);
1042+
$adapterDefinition->setAbstract(true);
1043+
unset($adapterConfig['parent']);
1044+
1045+
$adapterDefinition->addTag('cache.pool', $adapterConfig);
1046+
$container->setDefinition('cache.adapter.'.$name, $adapterDefinition);
1047+
}
1048+
10401049
foreach ($config['pools'] as $name => $poolConfig) {
10411050
$poolDefinition = new DefinitionDecorator($poolConfig['adapter']);
10421051
$poolDefinition->setPublic($poolConfig['public']);

Resources/config/cache_pools.xml

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -10,26 +10,23 @@
1010
<tag name="kernel.cache_clearer" />
1111
</service>
1212

13-
<service id="cache.adapter.shared" alias="cache.adapter.filesystem" />
14-
<service id="cache.adapter.local" alias="cache.adapter.filesystem" />
15-
16-
<service id="cache.pool.shared" parent="cache.adapter.shared">
17-
<tag name="cache.pool" clearer="cache.default_pools_clearer" />
18-
</service>
19-
20-
<service id="cache.pool.local" parent="cache.adapter.local">
21-
<tag name="cache.pool" clearer="cache.default_pools_clearer" />
13+
<service id="cache.pool.app" parent="cache.adapter.shared">
14+
<tag name="cache.pool" />
2215
</service>
2316

2417
<service id="cache.pool.validator" parent="cache.adapter.local" public="false">
25-
<tag name="cache.pool" clearer="cache.default_pools_clearer" />
18+
<tag name="cache.pool" />
2619
</service>
2720

2821
<service id="cache.pool.serializer" parent="cache.adapter.local" public="false">
29-
<tag name="cache.pool" clearer="cache.default_pools_clearer" />
22+
<tag name="cache.pool" />
3023
</service>
3124

25+
<service id="cache.adapter.local" alias="cache.adapter.filesystem" />
26+
<service id="cache.adapter.shared" alias="cache.adapter.filesystem" />
27+
3228
<service id="cache.adapter.apcu" class="Symfony\Component\Cache\Adapter\ApcuAdapter" abstract="true">
29+
<tag name="cache.pool" clearer="cache.default_pools_clearer" />
3330
<tag name="monolog.logger" channel="cache" />
3431
<argument /> <!-- namespace -->
3532
<argument /> <!-- default lifetime -->
@@ -39,6 +36,7 @@
3936
</service>
4037

4138
<service id="cache.adapter.doctrine" class="Symfony\Component\Cache\Adapter\DoctrineAdapter" abstract="true">
39+
<tag name="cache.pool" clearer="cache.default_pools_clearer" />
4240
<tag name="monolog.logger" channel="cache" />
4341
<argument /> <!-- Doctrine provider service -->
4442
<argument /> <!-- namespace -->
@@ -49,6 +47,7 @@
4947
</service>
5048

5149
<service id="cache.adapter.filesystem" class="Symfony\Component\Cache\Adapter\FilesystemAdapter" abstract="true">
50+
<tag name="cache.pool" clearer="cache.default_pools_clearer" />
5251
<tag name="monolog.logger" channel="cache" />
5352
<argument /> <!-- namespace -->
5453
<argument /> <!-- default lifetime -->
@@ -59,12 +58,14 @@
5958
</service>
6059

6160
<service id="cache.adapter.psr6" class="Symfony\Component\Cache\Adapter\ProxyAdapter" abstract="true">
61+
<tag name="cache.pool" clearer="cache.default_pools_clearer" />
6262
<argument /> <!-- PSR-6 provider service -->
6363
<argument /> <!-- namespace -->
6464
<argument /> <!-- default lifetime -->
6565
</service>
6666

6767
<service id="cache.adapter.redis" class="Symfony\Component\Cache\Adapter\RedisAdapter" abstract="true">
68+
<tag name="cache.pool" clearer="cache.default_pools_clearer" />
6869
<tag name="monolog.logger" channel="cache" />
6970
<argument /> <!-- Redis connection object -->
7071
<argument /> <!-- namespace -->

Resources/config/schema/symfony-1.0.xsd

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -206,16 +206,23 @@
206206

207207
<xsd:complexType name="cache">
208208
<xsd:choice minOccurs="1" maxOccurs="unbounded">
209+
<xsd:element name="adapter" type="cache_adapter" />
209210
<xsd:element name="pool" type="cache_pool" />
210211
</xsd:choice>
211212
</xsd:complexType>
212213

214+
<xsd:complexType name="cache_adapter">
215+
<xsd:attribute name="name" type="xsd:string" use="required" />
216+
<xsd:attribute name="parent" type="xsd:string" />
217+
<xsd:attribute name="default-lifetime" type="xsd:integer" />
218+
<xsd:attribute name="provider" type="xsd:string" />
219+
<xsd:attribute name="clearer" type="xsd:string" />
220+
</xsd:complexType>
221+
213222
<xsd:complexType name="cache_pool">
214223
<xsd:attribute name="name" type="xsd:string" use="required" />
215224
<xsd:attribute name="adapter" type="xsd:string" />
216225
<xsd:attribute name="public" type="xsd:boolean" />
217226
<xsd:attribute name="default-lifetime" type="xsd:integer" />
218-
<xsd:attribute name="provider" type="xsd:string" />
219-
<xsd:attribute name="clearer" type="xsd:string" />
220227
</xsd:complexType>
221228
</xsd:schema>

Tests/DependencyInjection/ConfigurationTest.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -267,6 +267,7 @@ protected static function getBundleDefaultConfig()
267267
'packages' => array(),
268268
),
269269
'cache' => array(
270+
'adapters' => array(),
270271
'pools' => array(),
271272
),
272273
);

Tests/DependencyInjection/Fixtures/php/cache.php

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,17 @@
22

33
$container->loadFromExtension('framework', array(
44
'cache' => array(
5+
'adapters' => array(
6+
'foo' => array(
7+
'parent' => 'cache.adapter.filesystem',
8+
'default_lifetime' => 30,
9+
),
10+
'app_redis' => array(
11+
'parent' => 'cache.adapter.redis',
12+
'provider' => 'app.redis_connection',
13+
'default_lifetime' => 30,
14+
),
15+
),
516
'pools' => array(
617
'foo' => array(
718
'adapter' => 'cache.adapter.apcu',
@@ -10,7 +21,6 @@
1021
'bar' => array(
1122
'adapter' => 'cache.adapter.doctrine',
1223
'default_lifetime' => 5,
13-
'provider' => 'app.doctrine_cache_provider',
1424
),
1525
'baz' => array(
1626
'adapter' => 'cache.adapter.filesystem',
@@ -19,7 +29,6 @@
1929
'foobar' => array(
2030
'adapter' => 'cache.adapter.psr6',
2131
'default_lifetime' => 10,
22-
'provider' => 'app.cache_pool',
2332
),
2433
'def' => array(
2534
'default_lifetime' => 11,

Tests/DependencyInjection/Fixtures/xml/cache.xml

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,12 @@
77

88
<framework:config>
99
<framework:cache>
10+
<framework:adapter name="foo" parent="cache.adapter.filesystem" default-lifetime="30" />
11+
<framework:adapter name="app_redis" parent="cache.adapter.redis" provider="app.redis_connection" default-lifetime="30" />
1012
<framework:pool name="foo" adapter="cache.adapter.apcu" default-lifetime="30" />
11-
<framework:pool name="bar" adapter="cache.adapter.doctrine" default-lifetime="5" provider="app.doctrine_cache_provider" />
13+
<framework:pool name="bar" adapter="cache.adapter.doctrine" default-lifetime="5" />
1214
<framework:pool name="baz" adapter="cache.adapter.filesystem" default-lifetime="7" />
13-
<framework:pool name="foobar" adapter="cache.adapter.psr6" default-lifetime="10" provider="app.cache_pool" />
15+
<framework:pool name="foobar" adapter="cache.adapter.psr6" default-lifetime="10" />
1416
<framework:pool name="def" default-lifetime="11" />
1517
</framework:cache>
1618
</framework:config>
Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,25 @@
11
framework:
22
cache:
3+
adapters:
4+
foo:
5+
parent: cache.adapter.filesystem
6+
default_lifetime: 30
7+
app_redis:
8+
parent: cache.adapter.redis
9+
provider: app.redis_connection
10+
default_lifetime: 30
311
pools:
412
foo:
513
adapter: cache.adapter.apcu
614
default_lifetime: 30
715
bar:
816
adapter: cache.adapter.doctrine
917
default_lifetime: 5
10-
provider: app.doctrine_cache_provider
1118
baz:
1219
adapter: cache.adapter.filesystem
1320
default_lifetime: 7
1421
foobar:
1522
adapter: cache.adapter.psr6
1623
default_lifetime: 10
17-
provider: app.cache_pool
1824
def:
1925
default_lifetime: 11

Tests/DependencyInjection/FrameworkExtensionTest.php

Lines changed: 48 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -615,6 +615,14 @@ public function testPropertyInfoEnabled()
615615
$this->assertTrue($container->has('property_info'));
616616
}
617617

618+
public function testCacheAdapterServices()
619+
{
620+
$container = $this->createContainerFromFile('cache');
621+
622+
$this->assertCacheAdaptersServiceDefinitionIsCreated($container, 'foo', 'cache.adapter.foo', null, 30);
623+
$this->assertCacheAdaptersServiceDefinitionIsCreated($container, 'app_redis', 'cache.adapter.redis', 'app.redis_connection', 30);
624+
}
625+
618626
public function testCachePoolServices()
619627
{
620628
$container = $this->createContainerFromFile('cache');
@@ -697,6 +705,46 @@ private function assertVersionStrategy(ContainerBuilder $container, Reference $r
697705
}
698706
}
699707

708+
private function assertCacheAdaptersServiceDefinitionIsCreated(ContainerBuilder $container, $name, $parent, $provider, $defaultLifetime)
709+
{
710+
$id = 'cache.adapter.'.$name;
711+
712+
$this->assertTrue($container->has($id), sprintf('Service definition "%s" for cache adapter "%s" is registered', $id, $name));
713+
714+
$adapterDefinition = $container->getDefinition($id);
715+
716+
$this->assertTrue($adapterDefinition->hasTag('cache.pool'), sprintf('Service definition "%s" is tagged with the "cache.pool" tag.', $id));
717+
$this->assertTrue($adapterDefinition->isAbstract(), sprintf('Service definition "%s" is abstract.', $id));
718+
719+
$tag = $adapterDefinition->getTag('cache.pool');
720+
$this->assertTrue(isset($tag[0]['default_lifetime']), 'The default lifetime is stored as an attribute of the "cache.pool" tag.');
721+
$this->assertSame($defaultLifetime, $tag[0]['default_lifetime'], 'The default lifetime is stored as an attribute of the "cache.pool" tag.');
722+
723+
if ($provider) {
724+
$this->assertTrue(isset($tag[0]['provider']), 'The provider is stored as an attribute of the "cache.pool" tag.');
725+
$this->assertSame($provider, $tag[0]['provider'], 'The provider is stored as an attribute of the "cache.pool" tag.');
726+
} else {
727+
$this->assertFalse(isset($tag[0]['provider']), 'No provider is stored as an attribute of the "cache.pool" tag.');
728+
}
729+
730+
$this->assertInstanceOf(DefinitionDecorator::class, $adapterDefinition, sprintf('Cache adapter "%s" is based on a parent.', $name));
731+
732+
$adapterId = $adapterDefinition->getParent();
733+
$adapterDefinition = $container->findDefinition($adapterId);
734+
735+
switch ($parent) {
736+
case 'cache.adapter.apcu':
737+
$this->assertSame(ApcuAdapter::class, $adapterDefinition->getClass());
738+
break;
739+
case 'cache.adapter.doctrine':
740+
$this->assertSame(DoctrineAdapter::class, $adapterDefinition->getClass());
741+
break;
742+
case 'cache.adapter.filesystem':
743+
$this->assertSame(FilesystemAdapter::class, $adapterDefinition->getClass());
744+
break;
745+
}
746+
}
747+
700748
private function assertCachePoolServiceDefinitionIsCreated(ContainerBuilder $container, $name, $adapter, $defaultLifetime)
701749
{
702750
$id = 'cache.pool.'.$name;
@@ -728,7 +776,5 @@ private function assertCachePoolServiceDefinitionIsCreated(ContainerBuilder $con
728776
$this->assertSame(FilesystemAdapter::class, $adapterDefinition->getClass());
729777
break;
730778
}
731-
732-
$this->assertTrue($adapterDefinition->isAbstract(), sprintf('Service definition "%s" is abstract.', $adapterId));
733779
}
734780
}

0 commit comments

Comments
 (0)