Skip to content

Commit 15f8148

Browse files
committed
Add cache.adapter.redis_tag_aware to use RedisCacheAwareAdapter
1 parent 07716ba commit 15f8148

File tree

7 files changed

+104
-76
lines changed

7 files changed

+104
-76
lines changed

src/Symfony/Bundle/FrameworkBundle/CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ CHANGELOG
66

77
* Added `framework.http_cache` configuration tree
88
* Added `framework.trusted_proxies` and `framework.trusted_headers` configuration options
9+
* Wired `RedisTagAwareAdapter` for pools usings tags and Redis adapter
910

1011
5.1.0
1112
-----

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

+23-31
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@
3030
use Symfony\Component\Cache\Adapter\AdapterInterface;
3131
use Symfony\Component\Cache\Adapter\ArrayAdapter;
3232
use Symfony\Component\Cache\Adapter\ChainAdapter;
33-
use Symfony\Component\Cache\Adapter\RedisTagAwareAdapter;
3433
use Symfony\Component\Cache\Adapter\TagAwareAdapter;
3534
use Symfony\Component\Cache\DependencyInjection\CachePoolPass;
3635
use Symfony\Component\Cache\Marshaller\DefaultMarshaller;
@@ -1854,8 +1853,11 @@ private function registerCacheConfiguration(array $config, ContainerBuilder $con
18541853
foreach ($config['pools'] as $name => $pool) {
18551854
$pool['adapters'] = $pool['adapters'] ?: ['cache.app'];
18561855

1856+
$isRedisTagAware = ['cache.adapter.redis_tag_aware'] === $pool['adapters'];
18571857
foreach ($pool['adapters'] as $provider => $adapter) {
1858-
if ($config['pools'][$adapter]['tags'] ?? false) {
1858+
if (($config['pools'][$adapter]['adapters'] ?? null) === ['cache.adapter.redis_tag_aware']) {
1859+
$isRedisTagAware = true;
1860+
} elseif ($config['pools'][$adapter]['tags'] ?? false) {
18591861
$pool['adapters'][$provider] = $adapter = '.'.$adapter.'.inner';
18601862
}
18611863
}
@@ -1870,43 +1872,33 @@ private function registerCacheConfiguration(array $config, ContainerBuilder $con
18701872
$pool['reset'] = 'reset';
18711873
}
18721874

1873-
if ($pool['tags']) {
1875+
if ($isRedisTagAware) {
1876+
$tagAwareId = $name;
1877+
$container->setAlias('.'.$name.'.inner', $name);
1878+
} elseif ($pool['tags']) {
18741879
if (true !== $pool['tags'] && ($config['pools'][$pool['tags']]['tags'] ?? false)) {
18751880
$pool['tags'] = '.'.$pool['tags'].'.inner';
18761881
}
1882+
$container->register($name, TagAwareAdapter::class)
1883+
->addArgument(new Reference('.'.$name.'.inner'))
1884+
->addArgument(true !== $pool['tags'] ? new Reference($pool['tags']) : null)
1885+
->setPublic($pool['public'])
1886+
;
18771887

1878-
$isRedis = $definition instanceof ChildDefinition && 'cache.adapter.redis' === $definition->getParent();
1879-
if (true === $pool['tags'] && $isRedis) {
1880-
$definition = new Definition(RedisTagAwareAdapter::class, [null, null, 0, null]);
1881-
if (!isset($pool['provider']) || !$pool['provider']) {
1882-
$pool['provider'] = 'cache.default_redis_provider';
1883-
}
1884-
$underlyingAdapterName = $name;
1885-
} else {
1886-
$container->register($name, TagAwareAdapter::class)
1887-
->addArgument(new Reference('.'.$name.'.inner'))
1888-
->addArgument(true !== $pool['tags'] ? new Reference($pool['tags']) : null)
1889-
->setPublic($pool['public'])
1890-
;
1891-
$underlyingAdapterName = '.'.$name.'.inner';
1892-
}
1893-
1894-
$pool['name'] = $name;
1888+
$pool['name'] = $tagAwareId = $name;
18951889
$pool['public'] = false;
1896-
$name = $underlyingAdapterName;
1897-
1898-
if (!\in_array($pool['name'], ['cache.app', 'cache.system'], true)) {
1899-
$container->registerAliasForArgument($pool['name'], TagAwareCacheInterface::class);
1900-
$container->registerAliasForArgument($name, CacheInterface::class, $pool['name']);
1901-
$container->registerAliasForArgument($name, CacheItemPoolInterface::class, $pool['name']);
1902-
}
1890+
$name = '.'.$name.'.inner';
19031891
} elseif (!\in_array($name, ['cache.app', 'cache.system'], true)) {
1904-
$container->register('.'.$name.'.taggable', TagAwareAdapter::class)
1892+
$tagAwareId = '.'.$name.'.taggable';
1893+
$container->register($tagAwareId, TagAwareAdapter::class)
19051894
->addArgument(new Reference($name))
19061895
;
1907-
$container->registerAliasForArgument('.'.$name.'.taggable', TagAwareCacheInterface::class, $name);
1908-
$container->registerAliasForArgument($name, CacheInterface::class);
1909-
$container->registerAliasForArgument($name, CacheItemPoolInterface::class);
1896+
}
1897+
1898+
if (!\in_array($name, ['cache.app', 'cache.system'], true)) {
1899+
$container->registerAliasForArgument($tagAwareId, TagAwareCacheInterface::class, $pool['name'] ?? $name);
1900+
$container->registerAliasForArgument($name, CacheInterface::class, $pool['name'] ?? $name);
1901+
$container->registerAliasForArgument($name, CacheItemPoolInterface::class, $pool['name'] ?? $name);
19101902
}
19111903

19121904
$definition->setPublic($pool['public']);

src/Symfony/Bundle/FrameworkBundle/Resources/config/cache.php

+17
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
use Symfony\Component\Cache\Adapter\PdoAdapter;
2323
use Symfony\Component\Cache\Adapter\ProxyAdapter;
2424
use Symfony\Component\Cache\Adapter\RedisAdapter;
25+
use Symfony\Component\Cache\Adapter\RedisTagAwareAdapter;
2526
use Symfony\Component\Cache\Adapter\TagAwareAdapter;
2627
use Symfony\Component\Cache\Marshaller\DefaultMarshaller;
2728
use Symfony\Component\HttpKernel\CacheClearer\Psr6CacheClearer;
@@ -148,6 +149,22 @@
148149
])
149150
->tag('monolog.logger', ['channel' => 'cache'])
150151

152+
->set('cache.adapter.redis_tag_aware', RedisTagAwareAdapter::class)
153+
->abstract()
154+
->args([
155+
abstract_arg('Redis connection service'),
156+
'', // namespace
157+
0, // default lifetime
158+
service('cache.default_marshaller')->ignoreOnInvalid(),
159+
])
160+
->call('setLogger', [service('logger')->ignoreOnInvalid()])
161+
->tag('cache.pool', [
162+
'provider' => 'cache.default_redis_provider',
163+
'clearer' => 'cache.default_clearer',
164+
'reset' => 'reset',
165+
])
166+
->tag('monolog.logger', ['channel' => 'cache'])
167+
151168
->set('cache.adapter.memcached', MemcachedAdapter::class)
152169
->abstract()
153170
->args([

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

+15-9
Original file line numberDiff line numberDiff line change
@@ -32,20 +32,26 @@
3232
'redis://foo' => 'cache.adapter.redis',
3333
],
3434
],
35-
'cache.tag' => [
35+
'cache.redis_tag_aware.foo' => [
36+
'adapter' => 'cache.adapter.redis_tag_aware',
37+
],
38+
'cache.redis_tag_aware.foo2' => [
3639
'tags' => true,
37-
'adapter' => 'cache.adapter.apcu',
40+
'adapter' => 'cache.adapter.redis_tag_aware',
3841
],
39-
'cache.redis.foo' => [
40-
'adapter' => 'cache.adapter.redis',
42+
'cache.redis_tag_aware.bar' => [
43+
'adapter' => 'cache.redis_tag_aware.foo',
4144
],
42-
'cache.redis.bar' => [
45+
'cache.redis_tag_aware.bar2' => [
4346
'tags' => true,
44-
'adapter' => 'cache.adapter.redis',
47+
'adapter' => 'cache.redis_tag_aware.foo',
4548
],
46-
'cache.redis.baz' => [
47-
'tags' => 'cache.adapter.redis',
48-
'adapter' => 'cache.adapter.redis',
49+
'cache.redis_tag_aware.baz' => [
50+
'adapter' => 'cache.redis_tag_aware.foo2',
51+
],
52+
'cache.redis_tag_aware.baz2' => [
53+
'tags' => true,
54+
'adapter' => 'cache.redis_tag_aware.foo2',
4955
],
5056
],
5157
],

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

+6-12
Original file line numberDiff line numberDiff line change
@@ -17,18 +17,12 @@
1717
<framework:adapter name="cache.adapter.filesystem" />
1818
<framework:adapter name="cache.adapter.redis" provider="redis://foo" />
1919
</framework:pool>
20-
<framework:pool name="cache.tag" tags="true">
21-
<framework:adapter name="cache.adapter.apcu" />
22-
</framework:pool>
23-
<framework:pool name="cache.redis.foo">
24-
<framework:adapter name="cache.adapter.redis" />
25-
</framework:pool>
26-
<framework:pool name="cache.redis.bar" tags="true">
27-
<framework:adapter name="cache.adapter.redis" />
28-
</framework:pool>
29-
<framework:pool name="cache.redis.baz" tags="cache.adapter.redis">
30-
<framework:adapter name="cache.adapter.redis" />
31-
</framework:pool>
20+
<framework:pool name="cache.redis_tag_aware.foo" adapter="cache.adapter.redis_tag_aware" />
21+
<framework:pool name="cache.redis_tag_aware.foo2" tags="true" adapter="cache.adapter.redis_tag_aware" />
22+
<framework:pool name="cache.redis_tag_aware.bar" adapter="cache.redis_tag_aware.foo" />
23+
<framework:pool name="cache.redis_tag_aware.bar2" tags="true" adapter="cache.redis_tag_aware.foo" />
24+
<framework:pool name="cache.redis_tag_aware.baz" adapter="cache.redis_tag_aware.foo2" />
25+
<framework:pool name="cache.redis_tag_aware.baz2" tags="true" adapter="cache.redis_tag_aware.foo2" />
3226
</framework:cache>
3327
</framework:config>
3428
</container>

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

+13-9
Original file line numberDiff line numberDiff line change
@@ -23,14 +23,18 @@ framework:
2323
- cache.adapter.array
2424
- cache.adapter.filesystem
2525
- {name: cache.adapter.redis, provider: 'redis://foo'}
26-
cache.tag:
26+
cache.redis_tag_aware.foo:
27+
adapter: cache.adapter.redis_tag_aware
28+
cache.redis_tag_aware.foo2:
2729
tags: true
28-
adapter: cache.adapter.apcu
29-
cache.redis.foo:
30-
adapter: cache.adapter.redis
31-
cache.redis.bar:
30+
adapter: cache.adapter.redis_tag_aware
31+
cache.redis_tag_aware.bar:
32+
adapter: cache.redis_tag_aware.foo
33+
cache.redis_tag_aware.bar2:
34+
tags: true
35+
adapter: cache.redis_tag_aware.foo
36+
cache.redis_tag_aware.baz:
37+
adapter: cache.redis_tag_aware.foo2
38+
cache.redis_tag_aware.baz2:
3239
tags: true
33-
adapter: cache.adapter.redis
34-
cache.redis.baz:
35-
tags: cache.adapter.redis
36-
adapter: cache.adapter.redis
40+
adapter: cache.redis_tag_aware.foo2

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

+29-15
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
namespace Symfony\Bundle\FrameworkBundle\Tests\DependencyInjection;
1313

1414
use Doctrine\Common\Annotations\Annotation;
15+
use Psr\Cache\CacheItemPoolInterface;
1516
use Psr\Log\LoggerAwareInterface;
1617
use Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\AddAnnotationsCachedReaderPass;
1718
use Symfony\Bundle\FrameworkBundle\DependencyInjection\FrameworkExtension;
@@ -27,7 +28,6 @@
2728
use Symfony\Component\Cache\Adapter\ProxyAdapter;
2829
use Symfony\Component\Cache\Adapter\RedisAdapter;
2930
use Symfony\Component\Cache\Adapter\RedisTagAwareAdapter;
30-
use Symfony\Component\Cache\Adapter\TagAwareAdapter;
3131
use Symfony\Component\Cache\DependencyInjection\CachePoolPass;
3232
use Symfony\Component\DependencyInjection\ChildDefinition;
3333
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
@@ -56,6 +56,7 @@
5656
use Symfony\Component\Validator\DependencyInjection\AddConstraintValidatorsPass;
5757
use Symfony\Component\Validator\Mapping\Loader\PropertyInfoLoader;
5858
use Symfony\Component\Workflow;
59+
use Symfony\Contracts\Cache\CacheInterface;
5960
use Symfony\Contracts\Cache\TagAwareCacheInterface;
6061

6162
abstract class FrameworkExtensionTest extends TestCase
@@ -1284,25 +1285,38 @@ public function testCachePoolServices()
12841285
$this->assertEquals($expected, $chain->getArguments());
12851286
}
12861287

1287-
public function testCacheTagAwareAdapters(): void
1288+
public function testRedisTagAwareAdapter(): void
12881289
{
12891290
$container = $this->createContainerFromFile('cache', [], true);
12901291

1291-
$data = [
1292-
'cacheFoo' => TagAwareAdapter::class,
1293-
'cacheTag' => TagAwareAdapter::class,
1294-
'cacheChain' => TagAwareAdapter::class,
1295-
'cacheRedisFoo' => TagAwareAdapter::class,
1296-
'cacheRedisBar' => RedisTagAwareAdapter::class,
1297-
'cacheRedisBaz' => TagAwareAdapter::class,
1292+
$aliasesForArguments = [];
1293+
$argNames = [
1294+
'cacheRedisTagAwareFoo',
1295+
'cacheRedisTagAwareFoo2',
1296+
'cacheRedisTagAwareBar',
1297+
'cacheRedisTagAwareBar2',
1298+
'cacheRedisTagAwareBaz',
1299+
'cacheRedisTagAwareBaz2',
12981300
];
1301+
foreach ($argNames as $argumentName) {
1302+
$aliasesForArguments[] = sprintf('%s $%s', TagAwareCacheInterface::class, $argumentName);
1303+
$aliasesForArguments[] = sprintf('%s $%s', CacheInterface::class, $argumentName);
1304+
$aliasesForArguments[] = sprintf('%s $%s', CacheItemPoolInterface::class, $argumentName);
1305+
}
1306+
1307+
foreach ($aliasesForArguments as $aliasForArgumentStr) {
1308+
$aliasForArgument = $container->getAlias($aliasForArgumentStr);
1309+
$this->assertNotNull($aliasForArgument, sprintf("No alias found for '%s'", $aliasForArgumentStr));
1310+
1311+
$def = $container->getDefinition((string) $aliasForArgument);
1312+
$this->assertInstanceOf(ChildDefinition::class, $def, sprintf("No definition found for '%s'", $aliasForArgumentStr));
1313+
1314+
$defParent = $container->getDefinition($def->getParent());
1315+
if ($defParent instanceof ChildDefinition) {
1316+
$defParent = $container->getDefinition($defParent->getParent());
1317+
}
12991318

1300-
foreach ($data as $varName => $expectedAdapter) {
1301-
$aliasForArgument = $container->getAlias(sprintf('%s $%s', TagAwareCacheInterface::class, $varName));
1302-
$this->assertNotNull($aliasForArgument);
1303-
$taggableDef = $container->getDefinition((string) $aliasForArgument);
1304-
$this->assertNotNull($taggableDef);
1305-
$this->assertSame($expectedAdapter, $taggableDef->getClass());
1319+
$this->assertSame(RedisTagAwareAdapter::class, $defParent->getClass(), sprintf("'%s' is not %s", $aliasForArgumentStr, RedisTagAwareAdapter::class));
13061320
}
13071321
}
13081322

0 commit comments

Comments
 (0)