Skip to content

Commit 09e70c0

Browse files
committed
feature #18667 [FrameworkBundle] Semantic config for app/system/pool caches (tgalopin, nicolas-grekas)
This PR was merged into the 3.1-dev branch. Discussion ---------- [FrameworkBundle] Semantic config for app/system/pool caches | Q | A | ------------- | --- | Branch? | 3.1 | Bug fix? | no | New feature? | no | BC breaks? | no | Deprecations? | no | Tests pass? | yes | Fixed tickets | #18625 | License | MIT | Doc PR | - Commits ------- a2a567d [FrameworkBundle] Simplify config for app/system/pool caches 80a5508 [FrameworkBundle] Add cache adapters in semantic configuration
2 parents d7d7711 + bc7303d commit 09e70c0

File tree

15 files changed

+180
-88
lines changed

15 files changed

+180
-88
lines changed

DependencyInjection/Compiler/CachePoolPass.php

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,10 @@
1111

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

14+
use Symfony\Component\Cache\Adapter\RedisAdapter;
1415
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
1516
use Symfony\Component\DependencyInjection\ContainerBuilder;
17+
use Symfony\Component\DependencyInjection\Definition;
1618
use Symfony\Component\DependencyInjection\DefinitionDecorator;
1719
use Symfony\Component\DependencyInjection\Reference;
1820

@@ -44,22 +46,24 @@ public function process(ContainerBuilder $container)
4446
if ($pool->isAbstract()) {
4547
continue;
4648
}
47-
$tags[0]['namespace'] = $this->getNamespace($namespaceSuffix, isset($tags[0]['namespace']) ? $tags[0]['namespace'] : $id);
4849
while ($adapter instanceof DefinitionDecorator) {
4950
$adapter = $container->findDefinition($adapter->getParent());
5051
if ($t = $adapter->getTag('cache.pool')) {
5152
$tags[0] += $t[0];
5253
}
5354
}
55+
if (!isset($tags[0]['namespace'])) {
56+
$tags[0]['namespace'] = $this->getNamespace($namespaceSuffix, $id);
57+
}
5458
if (isset($tags[0]['clearer'])) {
5559
$clearer = $container->getDefinition($tags[0]['clearer']);
5660
} else {
5761
$clearer = null;
5862
}
5963
unset($tags[0]['clearer']);
6064

61-
if (isset($tags[0]['provider']) && is_string($tags[0]['provider'])) {
62-
$tags[0]['provider'] = new Reference($tags[0]['provider']);
65+
if (isset($tags[0]['provider'])) {
66+
$tags[0]['provider'] = new Reference(static::getServiceProvider($container, $tags[0]['provider']));
6367
}
6468
$i = 0;
6569
foreach ($attributes as $attr) {
@@ -82,4 +86,24 @@ private function getNamespace($namespaceSuffix, $id)
8286
{
8387
return substr(str_replace('/', '-', base64_encode(md5($id.$namespaceSuffix, true))), 0, 10);
8488
}
89+
90+
/**
91+
* @internal
92+
*/
93+
public static function getServiceProvider(ContainerBuilder $container, $name)
94+
{
95+
if (0 === strpos($name, 'redis://')) {
96+
$dsn = $name;
97+
98+
if (!$container->hasDefinition($name = md5($dsn))) {
99+
$definition = new Definition(\Redis::class);
100+
$definition->setPublic(false);
101+
$definition->setFactory(array(RedisAdapter::class, 'createConnection'));
102+
$definition->setArguments(array($dsn));
103+
$container->setDefinition($name, $definition);
104+
}
105+
}
106+
107+
return $name;
108+
}
85109
}

DependencyInjection/Configuration.php

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -558,25 +558,35 @@ private function addCacheSection(ArrayNodeDefinition $rootNode)
558558
->addDefaultsIfNotSet()
559559
->fixXmlConfig('pool')
560560
->children()
561+
->scalarNode('app')
562+
->info('App related cache pools configuration')
563+
->defaultValue('cache.adapter.filesystem')
564+
->end()
565+
->scalarNode('system')
566+
->info('System related cache pools configuration')
567+
->defaultValue('cache.adapter.filesystem')
568+
->end()
569+
->scalarNode('directory')->defaultValue('%kernel.cache_dir%/pools')->end()
570+
->scalarNode('default_doctrine_provider')->end()
571+
->scalarNode('default_psr6_provider')->end()
572+
->scalarNode('default_redis_provider')->defaultValue('redis://localhost')->end()
561573
->arrayNode('pools')
562574
->useAttributeAsKey('name')
563575
->prototype('array')
564576
->children()
565-
->scalarNode('adapter')
566-
->info('The cache pool adapter service to use as template definition.')
567-
->defaultValue('cache.adapter.shared')
568-
->end()
577+
->scalarNode('adapter')->defaultValue('cache.app')->end()
569578
->booleanNode('public')->defaultFalse()->end()
570579
->integerNode('default_lifetime')->end()
571580
->scalarNode('provider')
572581
->info('The service name to use as provider when the specified adapter needs one.')
573582
->end()
574-
->scalarNode('namespace')
575-
->info('The namespace where cached items are stored. Auto-generated by default. Set to false to disable namespacing.')
576-
->end()
577-
->scalarNode('clearer')->defaultValue('cache.default_pools_clearer')->end()
583+
->scalarNode('clearer')->defaultValue('cache.default_clearer')->end()
578584
->end()
579585
->end()
586+
->validate()
587+
->ifTrue(function ($v) { return isset($v['cache.app']) || isset($v['cache.system']); })
588+
->thenInvalid('"cache.app" and "cache.system" are reserved names')
589+
->end()
580590
->end()
581591
->end()
582592
->end()

DependencyInjection/FrameworkExtension.php

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ public function load(array $configs, ContainerBuilder $container)
7373
$loader->load('property_access.xml');
7474

7575
// Load Cache configuration first as it is used by other components
76-
$loader->load('cache_pools.xml');
76+
$loader->load('cache.xml');
7777

7878
$configuration = $this->getConfiguration($configs, $container);
7979
$config = $this->processConfiguration($configuration, $configs);
@@ -984,7 +984,7 @@ private function registerSerializerConfiguration(array $config, ContainerBuilder
984984
$chainLoader->replaceArgument(0, $serializerLoaders);
985985

986986
if (isset($config['cache']) && $config['cache']) {
987-
@trigger_error('The "framework.serializer.cache" option is deprecated since Symfony 3.1 and will be removed in 4.0. You can configure a cache pool called "serializer" under "framework.cache.pools" instead.', E_USER_DEPRECATED);
987+
@trigger_error('The "framework.serializer.cache" option is deprecated since Symfony 3.1 and will be removed in 4.0. Configure the "cache.serializer" service under "framework.cache.pools" instead.', E_USER_DEPRECATED);
988988

989989
$container->setParameter(
990990
'serializer.mapping.cache.prefix',
@@ -999,7 +999,7 @@ private function registerSerializerConfiguration(array $config, ContainerBuilder
999999
CacheClassMetadataFactory::class,
10001000
array(
10011001
new Reference('serializer.mapping.cache_class_metadata_factory.inner'),
1002-
new Reference('cache.pool.serializer'),
1002+
new Reference('cache.serializer'),
10031003
)
10041004
);
10051005
$cacheMetadataFactory->setPublic(false);
@@ -1037,13 +1037,26 @@ private function registerPropertyInfoConfiguration(array $config, ContainerBuild
10371037

10381038
private function registerCacheConfiguration(array $config, ContainerBuilder $container, XmlFileLoader $loader)
10391039
{
1040-
foreach ($config['pools'] as $name => $poolConfig) {
1041-
$poolDefinition = new DefinitionDecorator($poolConfig['adapter']);
1042-
$poolDefinition->setPublic($poolConfig['public']);
1043-
unset($poolConfig['adapter'], $poolConfig['public']);
1040+
$container->getDefinition('cache.adapter.filesystem')->replaceArgument(2, $config['directory']);
10441041

1045-
$poolDefinition->addTag('cache.pool', $poolConfig);
1046-
$container->setDefinition('cache.pool.'.$name, $poolDefinition);
1042+
foreach (array('doctrine', 'psr6', 'redis') as $name) {
1043+
if (isset($config[$name = 'default_'.$name.'_provider'])) {
1044+
$container->setAlias('cache.'.$name, Compiler\CachePoolPass::getServiceProvider($container, $config[$name]));
1045+
}
1046+
}
1047+
foreach (array('app', 'system') as $name) {
1048+
$config['pools']['cache.'.$name] = array(
1049+
'adapter' => $config[$name],
1050+
'public' => true,
1051+
);
1052+
}
1053+
foreach ($config['pools'] as $name => $pool) {
1054+
$definition = new DefinitionDecorator($pool['adapter']);
1055+
$definition->setPublic($pool['public']);
1056+
unset($pool['adapter'], $pool['public']);
1057+
1058+
$definition->addTag('cache.pool', $pool);
1059+
$container->setDefinition($name, $definition);
10471060
}
10481061

10491062
$this->addClassesToCompile(array(

Resources/config/cache_pools.xml renamed to Resources/config/cache.xml

Lines changed: 18 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -6,30 +6,24 @@
66

77
<services>
88

9-
<service id="cache.default_pools_clearer" class="Symfony\Component\HttpKernel\CacheClearer\Psr6CacheClearer" public="false">
10-
<tag name="kernel.cache_clearer" />
11-
</service>
12-
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" />
9+
<service id="cache.app" parent="cache.adapter.filesystem">
10+
<tag name="cache.pool" />
1811
</service>
1912

20-
<service id="cache.pool.local" parent="cache.adapter.local">
21-
<tag name="cache.pool" clearer="cache.default_pools_clearer" />
13+
<service id="cache.system" parent="cache.adapter.filesystem">
14+
<tag name="cache.pool" />
2215
</service>
2316

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

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

3225
<service id="cache.adapter.apcu" class="Symfony\Component\Cache\Adapter\ApcuAdapter" abstract="true">
26+
<tag name="cache.pool" clearer="cache.default_clearer" />
3327
<tag name="monolog.logger" channel="cache" />
3428
<argument /> <!-- namespace -->
3529
<argument /> <!-- default lifetime -->
@@ -39,6 +33,7 @@
3933
</service>
4034

4135
<service id="cache.adapter.doctrine" class="Symfony\Component\Cache\Adapter\DoctrineAdapter" abstract="true">
36+
<tag name="cache.pool" provider="cache.default_doctrine_provider" clearer="cache.default_clearer" />
4237
<tag name="monolog.logger" channel="cache" />
4338
<argument /> <!-- Doctrine provider service -->
4439
<argument /> <!-- namespace -->
@@ -49,6 +44,7 @@
4944
</service>
5045

5146
<service id="cache.adapter.filesystem" class="Symfony\Component\Cache\Adapter\FilesystemAdapter" abstract="true">
47+
<tag name="cache.pool" clearer="cache.default_clearer" />
5248
<tag name="monolog.logger" channel="cache" />
5349
<argument /> <!-- namespace -->
5450
<argument /> <!-- default lifetime -->
@@ -59,20 +55,26 @@
5955
</service>
6056

6157
<service id="cache.adapter.psr6" class="Symfony\Component\Cache\Adapter\ProxyAdapter" abstract="true">
58+
<tag name="cache.pool" provider="cache.default_psr6_provider" clearer="cache.default_clearer" />
6259
<argument /> <!-- PSR-6 provider service -->
6360
<argument /> <!-- namespace -->
6461
<argument /> <!-- default lifetime -->
6562
</service>
6663

6764
<service id="cache.adapter.redis" class="Symfony\Component\Cache\Adapter\RedisAdapter" abstract="true">
65+
<tag name="cache.pool" provider="cache.default_redis_provider" clearer="cache.default_clearer" />
6866
<tag name="monolog.logger" channel="cache" />
69-
<argument /> <!-- Redis connection object -->
67+
<argument /> <!-- Redis connection service -->
7068
<argument /> <!-- namespace -->
7169
<argument /> <!-- default lifetime -->
7270
<call method="setLogger">
7371
<argument type="service" id="logger" on-invalid="ignore" />
7472
</call>
7573
</service>
7674

75+
<service id="cache.default_clearer" class="Symfony\Component\HttpKernel\CacheClearer\Psr6CacheClearer" public="false">
76+
<tag name="kernel.cache_clearer" />
77+
</service>
78+
7779
</services>
7880
</container>

Resources/config/schema/symfony-1.0.xsd

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -205,9 +205,15 @@
205205
</xsd:complexType>
206206

207207
<xsd:complexType name="cache">
208-
<xsd:choice minOccurs="1" maxOccurs="unbounded">
209-
<xsd:element name="pool" type="cache_pool" />
210-
</xsd:choice>
208+
<xsd:sequence>
209+
<xsd:element name="app" type="xsd:string" minOccurs="0" maxOccurs="1" />
210+
<xsd:element name="system" type="xsd:string" minOccurs="0" maxOccurs="1" />
211+
<xsd:element name="directory" type="xsd:string" minOccurs="0" maxOccurs="1" />
212+
<xsd:element name="default-doctrine-provider" type="xsd:string" minOccurs="0" maxOccurs="1" />
213+
<xsd:element name="default-psr6-provider" type="xsd:string" minOccurs="0" maxOccurs="1" />
214+
<xsd:element name="default-redis-provider" type="xsd:string" minOccurs="0" maxOccurs="1" />
215+
<xsd:element name="pool" type="cache_pool" minOccurs="0" maxOccurs="unbounded" />
216+
</xsd:sequence>
211217
</xsd:complexType>
212218

213219
<xsd:complexType name="cache_pool">

Resources/config/validator.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
<service id="validator.mapping.class_metadata_factory" alias="validator" public="false" />
3030

3131
<service id="validator.mapping.cache.symfony" class="Symfony\Component\Validator\Mapping\Cache\Psr6Cache" public="false">
32-
<argument type="service" id="cache.pool.validator" />
32+
<argument type="service" id="cache.validator" />
3333
</service>
3434

3535
<service id="validator.mapping.cache.doctrine.apc" class="Symfony\Component\Validator\Mapping\Cache\DoctrineCache" public="false">

Tests/DependencyInjection/ConfigurationTest.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -268,6 +268,10 @@ protected static function getBundleDefaultConfig()
268268
),
269269
'cache' => array(
270270
'pools' => array(),
271+
'app' => 'cache.adapter.filesystem',
272+
'system' => 'cache.adapter.filesystem',
273+
'directory' => '%kernel.cache_dir%/pools',
274+
'default_redis_provider' => 'redis://localhost',
271275
),
272276
);
273277
}

Tests/DependencyInjection/Fixtures/php/cache.php

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,25 +3,25 @@
33
$container->loadFromExtension('framework', array(
44
'cache' => array(
55
'pools' => array(
6-
'foo' => array(
6+
'cache.foo' => array(
77
'adapter' => 'cache.adapter.apcu',
88
'default_lifetime' => 30,
99
),
10-
'bar' => array(
10+
'cache.bar' => array(
1111
'adapter' => 'cache.adapter.doctrine',
1212
'default_lifetime' => 5,
1313
'provider' => 'app.doctrine_cache_provider',
1414
),
15-
'baz' => array(
15+
'cache.baz' => array(
1616
'adapter' => 'cache.adapter.filesystem',
1717
'default_lifetime' => 7,
1818
),
19-
'foobar' => array(
19+
'cache.foobar' => array(
2020
'adapter' => 'cache.adapter.psr6',
2121
'default_lifetime' => 10,
2222
'provider' => 'app.cache_pool',
2323
),
24-
'def' => array(
24+
'cache.def' => array(
2525
'default_lifetime' => 11,
2626
),
2727
),

Tests/DependencyInjection/Fixtures/xml/cache.xml

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,11 @@
77

88
<framework:config>
99
<framework:cache>
10-
<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" />
12-
<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" />
14-
<framework:pool name="def" default-lifetime="11" />
10+
<framework:pool name="cache.foo" adapter="cache.adapter.apcu" default-lifetime="30" />
11+
<framework:pool name="cache.bar" adapter="cache.adapter.doctrine" default-lifetime="5" provider="app.doctrine_cache_provider" />
12+
<framework:pool name="cache.baz" adapter="cache.adapter.filesystem" default-lifetime="7" />
13+
<framework:pool name="cache.foobar" adapter="cache.adapter.psr6" default-lifetime="10" provider="app.cache_pool" />
14+
<framework:pool name="cache.def" default-lifetime="11" />
1515
</framework:cache>
1616
</framework:config>
1717
</container>
Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,19 @@
11
framework:
22
cache:
33
pools:
4-
foo:
4+
cache.foo:
55
adapter: cache.adapter.apcu
66
default_lifetime: 30
7-
bar:
7+
cache.bar:
88
adapter: cache.adapter.doctrine
99
default_lifetime: 5
1010
provider: app.doctrine_cache_provider
11-
baz:
11+
cache.baz:
1212
adapter: cache.adapter.filesystem
1313
default_lifetime: 7
14-
foobar:
14+
cache.foobar:
1515
adapter: cache.adapter.psr6
1616
default_lifetime: 10
1717
provider: app.cache_pool
18-
def:
18+
cache.def:
1919
default_lifetime: 11

0 commit comments

Comments
 (0)