From 68d16384d47456d095477bc257bfdd552660217d Mon Sep 17 00:00:00 2001 From: Laurent VOULLEMIER Date: Thu, 13 Aug 2020 10:00:38 +0200 Subject: [PATCH] Add cache.adapter.redis_tag_aware to use RedisCacheAwareAdapter --- .../Bundle/FrameworkBundle/CHANGELOG.md | 1 + .../FrameworkExtension.php | 30 +++++++------- .../Resources/config/cache.php | 17 ++++++++ .../Fixtures/php/cache.php | 21 ++++++++++ .../Fixtures/xml/cache.xml | 6 +++ .../Fixtures/yml/cache.yml | 15 +++++++ .../FrameworkExtensionTest.php | 39 +++++++++++++++++++ 7 files changed, 116 insertions(+), 13 deletions(-) diff --git a/src/Symfony/Bundle/FrameworkBundle/CHANGELOG.md b/src/Symfony/Bundle/FrameworkBundle/CHANGELOG.md index 354fd8da36636..f046415bb9cc9 100644 --- a/src/Symfony/Bundle/FrameworkBundle/CHANGELOG.md +++ b/src/Symfony/Bundle/FrameworkBundle/CHANGELOG.md @@ -9,6 +9,7 @@ CHANGELOG * Deprecated the public `form.factory`, `form.type.file`, `translator`, `security.csrf.token_manager`, `serializer`, `cache_clearer`, `filesystem` and `validator` services to private. * Added `TemplateAwareDataCollectorInterface` and `AbstractDataCollector` to simplify custom data collector creation and leverage autoconfiguration + * Add `cache.adapter.redis_tag_aware` tag to use `RedisCacheAwareAdapter` 5.1.0 ----- diff --git a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php index 1c04a0ca7fac7..0d9e8c66ff6a5 100644 --- a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php +++ b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php @@ -1861,8 +1861,11 @@ private function registerCacheConfiguration(array $config, ContainerBuilder $con foreach ($config['pools'] as $name => $pool) { $pool['adapters'] = $pool['adapters'] ?: ['cache.app']; + $isRedisTagAware = ['cache.adapter.redis_tag_aware'] === $pool['adapters']; foreach ($pool['adapters'] as $provider => $adapter) { - if ($config['pools'][$adapter]['tags'] ?? false) { + if (($config['pools'][$adapter]['adapters'] ?? null) === ['cache.adapter.redis_tag_aware']) { + $isRedisTagAware = true; + } elseif ($config['pools'][$adapter]['tags'] ?? false) { $pool['adapters'][$provider] = $adapter = '.'.$adapter.'.inner'; } } @@ -1877,7 +1880,10 @@ private function registerCacheConfiguration(array $config, ContainerBuilder $con $pool['reset'] = 'reset'; } - if ($pool['tags']) { + if ($isRedisTagAware) { + $tagAwareId = $name; + $container->setAlias('.'.$name.'.inner', $name); + } elseif ($pool['tags']) { if (true !== $pool['tags'] && ($config['pools'][$pool['tags']]['tags'] ?? false)) { $pool['tags'] = '.'.$pool['tags'].'.inner'; } @@ -1887,22 +1893,20 @@ private function registerCacheConfiguration(array $config, ContainerBuilder $con ->setPublic($pool['public']) ; - $pool['name'] = $name; + $pool['name'] = $tagAwareId = $name; $pool['public'] = false; $name = '.'.$name.'.inner'; - - if (!\in_array($pool['name'], ['cache.app', 'cache.system'], true)) { - $container->registerAliasForArgument($pool['name'], TagAwareCacheInterface::class); - $container->registerAliasForArgument($name, CacheInterface::class, $pool['name']); - $container->registerAliasForArgument($name, CacheItemPoolInterface::class, $pool['name']); - } } elseif (!\in_array($name, ['cache.app', 'cache.system'], true)) { - $container->register('.'.$name.'.taggable', TagAwareAdapter::class) + $tagAwareId = '.'.$name.'.taggable'; + $container->register($tagAwareId, TagAwareAdapter::class) ->addArgument(new Reference($name)) ; - $container->registerAliasForArgument('.'.$name.'.taggable', TagAwareCacheInterface::class, $name); - $container->registerAliasForArgument($name, CacheInterface::class); - $container->registerAliasForArgument($name, CacheItemPoolInterface::class); + } + + if (!\in_array($name, ['cache.app', 'cache.system'], true)) { + $container->registerAliasForArgument($tagAwareId, TagAwareCacheInterface::class, $pool['name'] ?? $name); + $container->registerAliasForArgument($name, CacheInterface::class, $pool['name'] ?? $name); + $container->registerAliasForArgument($name, CacheItemPoolInterface::class, $pool['name'] ?? $name); } $definition->setPublic($pool['public']); diff --git a/src/Symfony/Bundle/FrameworkBundle/Resources/config/cache.php b/src/Symfony/Bundle/FrameworkBundle/Resources/config/cache.php index 0077ffa967e3e..6f82bc6012855 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Resources/config/cache.php +++ b/src/Symfony/Bundle/FrameworkBundle/Resources/config/cache.php @@ -22,6 +22,7 @@ use Symfony\Component\Cache\Adapter\PdoAdapter; use Symfony\Component\Cache\Adapter\ProxyAdapter; use Symfony\Component\Cache\Adapter\RedisAdapter; +use Symfony\Component\Cache\Adapter\RedisTagAwareAdapter; use Symfony\Component\Cache\Adapter\TagAwareAdapter; use Symfony\Component\Cache\Marshaller\DefaultMarshaller; use Symfony\Component\HttpKernel\CacheClearer\Psr6CacheClearer; @@ -148,6 +149,22 @@ ]) ->tag('monolog.logger', ['channel' => 'cache']) + ->set('cache.adapter.redis_tag_aware', RedisTagAwareAdapter::class) + ->abstract() + ->args([ + abstract_arg('Redis connection service'), + '', // namespace + 0, // default lifetime + service('cache.default_marshaller')->ignoreOnInvalid(), + ]) + ->call('setLogger', [service('logger')->ignoreOnInvalid()]) + ->tag('cache.pool', [ + 'provider' => 'cache.default_redis_provider', + 'clearer' => 'cache.default_clearer', + 'reset' => 'reset', + ]) + ->tag('monolog.logger', ['channel' => 'cache']) + ->set('cache.adapter.memcached', MemcachedAdapter::class) ->abstract() ->args([ diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/php/cache.php b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/php/cache.php index 8d92edf766924..040e29bbd3edd 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/php/cache.php +++ b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/php/cache.php @@ -32,6 +32,27 @@ 'redis://foo' => 'cache.adapter.redis', ], ], + 'cache.redis_tag_aware.foo' => [ + 'adapter' => 'cache.adapter.redis_tag_aware', + ], + 'cache.redis_tag_aware.foo2' => [ + 'tags' => true, + 'adapter' => 'cache.adapter.redis_tag_aware', + ], + 'cache.redis_tag_aware.bar' => [ + 'adapter' => 'cache.redis_tag_aware.foo', + ], + 'cache.redis_tag_aware.bar2' => [ + 'tags' => true, + 'adapter' => 'cache.redis_tag_aware.foo', + ], + 'cache.redis_tag_aware.baz' => [ + 'adapter' => 'cache.redis_tag_aware.foo2', + ], + 'cache.redis_tag_aware.baz2' => [ + 'tags' => true, + 'adapter' => 'cache.redis_tag_aware.foo2', + ], ], ], ]); diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/xml/cache.xml b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/xml/cache.xml index 2db74964b53e7..f8d49eb7df645 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/xml/cache.xml +++ b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/xml/cache.xml @@ -17,6 +17,12 @@ + + + + + + diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/yml/cache.yml b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/yml/cache.yml index ee20bc74b22d6..4921492d1af83 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/yml/cache.yml +++ b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/yml/cache.yml @@ -23,3 +23,18 @@ framework: - cache.adapter.array - cache.adapter.filesystem - {name: cache.adapter.redis, provider: 'redis://foo'} + cache.redis_tag_aware.foo: + adapter: cache.adapter.redis_tag_aware + cache.redis_tag_aware.foo2: + tags: true + adapter: cache.adapter.redis_tag_aware + cache.redis_tag_aware.bar: + adapter: cache.redis_tag_aware.foo + cache.redis_tag_aware.bar2: + tags: true + adapter: cache.redis_tag_aware.foo + cache.redis_tag_aware.baz: + adapter: cache.redis_tag_aware.foo2 + cache.redis_tag_aware.baz2: + tags: true + adapter: cache.redis_tag_aware.foo2 diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/FrameworkExtensionTest.php b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/FrameworkExtensionTest.php index 7818d3c9c7985..7671c8766c056 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/FrameworkExtensionTest.php +++ b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/FrameworkExtensionTest.php @@ -12,6 +12,7 @@ namespace Symfony\Bundle\FrameworkBundle\Tests\DependencyInjection; use Doctrine\Common\Annotations\Annotation; +use Psr\Cache\CacheItemPoolInterface; use Psr\Log\LoggerAwareInterface; use Symfony\Bridge\PhpUnit\ExpectDeprecationTrait; use Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\AddAnnotationsCachedReaderPass; @@ -27,6 +28,7 @@ use Symfony\Component\Cache\Adapter\FilesystemAdapter; use Symfony\Component\Cache\Adapter\ProxyAdapter; use Symfony\Component\Cache\Adapter\RedisAdapter; +use Symfony\Component\Cache\Adapter\RedisTagAwareAdapter; use Symfony\Component\Cache\DependencyInjection\CachePoolPass; use Symfony\Component\DependencyInjection\ChildDefinition; use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; @@ -56,6 +58,8 @@ use Symfony\Component\Validator\Mapping\Loader\PropertyInfoLoader; use Symfony\Component\Workflow; use Symfony\Component\Workflow\WorkflowEvents; +use Symfony\Contracts\Cache\CacheInterface; +use Symfony\Contracts\Cache\TagAwareCacheInterface; abstract class FrameworkExtensionTest extends TestCase { @@ -1316,6 +1320,41 @@ public function testCachePoolServices() $this->assertEquals($expected, $chain->getArguments()); } + public function testRedisTagAwareAdapter(): void + { + $container = $this->createContainerFromFile('cache', [], true); + + $aliasesForArguments = []; + $argNames = [ + 'cacheRedisTagAwareFoo', + 'cacheRedisTagAwareFoo2', + 'cacheRedisTagAwareBar', + 'cacheRedisTagAwareBar2', + 'cacheRedisTagAwareBaz', + 'cacheRedisTagAwareBaz2', + ]; + foreach ($argNames as $argumentName) { + $aliasesForArguments[] = sprintf('%s $%s', TagAwareCacheInterface::class, $argumentName); + $aliasesForArguments[] = sprintf('%s $%s', CacheInterface::class, $argumentName); + $aliasesForArguments[] = sprintf('%s $%s', CacheItemPoolInterface::class, $argumentName); + } + + foreach ($aliasesForArguments as $aliasForArgumentStr) { + $aliasForArgument = $container->getAlias($aliasForArgumentStr); + $this->assertNotNull($aliasForArgument, sprintf("No alias found for '%s'", $aliasForArgumentStr)); + + $def = $container->getDefinition((string) $aliasForArgument); + $this->assertInstanceOf(ChildDefinition::class, $def, sprintf("No definition found for '%s'", $aliasForArgumentStr)); + + $defParent = $container->getDefinition($def->getParent()); + if ($defParent instanceof ChildDefinition) { + $defParent = $container->getDefinition($defParent->getParent()); + } + + $this->assertSame(RedisTagAwareAdapter::class, $defParent->getClass(), sprintf("'%s' is not %s", $aliasForArgumentStr, RedisTagAwareAdapter::class)); + } + } + public function testRemovesResourceCheckerConfigCacheFactoryArgumentOnlyIfNoDebug() { $container = $this->createContainer(['kernel.debug' => true]); pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy