From 5e3cbecd54af04fc7f3f99f8b37f8d82e1c56885 Mon Sep 17 00:00:00 2001 From: Nicolas Grekas Date: Thu, 24 Nov 2016 11:24:08 +0100 Subject: [PATCH] [Bridge/Doctrine] Use cache.prefix.seed parameter for generating cache namespace --- .../AbstractDoctrineExtension.php | 11 ++++++++--- .../Compiler/CachePoolClearerPass.php | 2 ++ .../Compiler/CachePoolPass.php | 18 ++++++++---------- .../Compiler/CachePoolClearerPassTest.php | 4 ++++ .../Compiler/CachePoolPassTest.php | 16 ++++++++++++++-- 5 files changed, 36 insertions(+), 15 deletions(-) diff --git a/src/Symfony/Bridge/Doctrine/DependencyInjection/AbstractDoctrineExtension.php b/src/Symfony/Bridge/Doctrine/DependencyInjection/AbstractDoctrineExtension.php index 3a6a877e1fc4e..b9cac9f71845a 100644 --- a/src/Symfony/Bridge/Doctrine/DependencyInjection/AbstractDoctrineExtension.php +++ b/src/Symfony/Bridge/Doctrine/DependencyInjection/AbstractDoctrineExtension.php @@ -384,9 +384,14 @@ protected function loadCacheDriver($cacheName, $objectManagerName, array $cacheD if (!isset($cacheDriver['namespace'])) { // generate a unique namespace for the given application - $env = $container->getParameter('kernel.root_dir').$container->getParameter('kernel.environment'); - $hash = hash('sha256', $env); - $namespace = 'sf2'.$this->getMappingResourceExtension().'_'.$objectManagerName.'_'.$hash; + if ($container->hasParameter('cache.prefix.seed')) { + $seed = '.'.$container->getParameterBag()->resolveValue($container->getParameter('cache.prefix.seed')); + } else { + $seed = '_'.$container->getParameter('kernel.root_dir'); + } + $seed .= '.'.$container->getParameter('kernel.name').'.'.$container->getParameter('kernel.environment').'.'.$container->getParameter('kernel.debug'); + $hash = hash('sha256', $seed); + $namespace = 'sf_'.$this->getMappingResourceExtension().'_'.$objectManagerName.'_'.$hash; $cacheDriver['namespace'] = $namespace; } diff --git a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Compiler/CachePoolClearerPass.php b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Compiler/CachePoolClearerPass.php index 146c3c8c73416..901722756bd4a 100644 --- a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Compiler/CachePoolClearerPass.php +++ b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Compiler/CachePoolClearerPass.php @@ -25,6 +25,8 @@ final class CachePoolClearerPass implements CompilerPassInterface */ public function process(ContainerBuilder $container) { + $container->getParameterBag()->remove('cache.prefix.seed'); + foreach ($container->findTaggedServiceIds('cache.pool') as $id => $attributes) { foreach (array_reverse($attributes) as $attr) { if (isset($attr['clearer'])) { diff --git a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Compiler/CachePoolPass.php b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Compiler/CachePoolPass.php index 6186cc9d5ff24..593b7782c66b0 100644 --- a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Compiler/CachePoolPass.php +++ b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Compiler/CachePoolPass.php @@ -29,14 +29,12 @@ class CachePoolPass implements CompilerPassInterface */ public function process(ContainerBuilder $container) { - $namespaceSuffix = ''; - - foreach (array('kernel.name', 'kernel.environment', 'kernel.debug', 'cache.prefix.seed') as $key) { - if ($container->hasParameter($key)) { - $namespaceSuffix .= '.'.$container->getParameter($key); - } + if ($container->hasParameter('cache.prefix.seed')) { + $seed = '.'.$container->getParameterBag()->resolveValue($container->getParameter('cache.prefix.seed')); + } else { + $seed = '_'.$container->getParameter('kernel.root_dir'); } - $container->getParameterBag()->remove('cache.prefix.seed'); + $seed .= '.'.$container->getParameter('kernel.name').'.'.$container->getParameter('kernel.environment').'.'.$container->getParameter('kernel.debug'); $aliases = $container->getAliases(); $attributes = array( @@ -56,7 +54,7 @@ public function process(ContainerBuilder $container) } } if (!isset($tags[0]['namespace'])) { - $tags[0]['namespace'] = $this->getNamespace($namespaceSuffix, $id); + $tags[0]['namespace'] = $this->getNamespace($seed, $id); } if (isset($tags[0]['clearer'])) { $clearer = strtolower($tags[0]['clearer']); @@ -88,9 +86,9 @@ public function process(ContainerBuilder $container) } } - private function getNamespace($namespaceSuffix, $id) + private function getNamespace($seed, $id) { - return substr(str_replace('/', '-', base64_encode(hash('sha256', $id.$namespaceSuffix, true))), 0, 10); + return substr(str_replace('/', '-', base64_encode(hash('sha256', $id.$seed, true))), 0, 10); } /** diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Compiler/CachePoolClearerPassTest.php b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Compiler/CachePoolClearerPassTest.php index 62a41962316e2..38a2d38761e3b 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Compiler/CachePoolClearerPassTest.php +++ b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Compiler/CachePoolClearerPassTest.php @@ -24,6 +24,10 @@ class CachePoolClearerPassTest extends \PHPUnit_Framework_TestCase public function testPoolRefsAreWeak() { $container = new ContainerBuilder(); + $container->setParameter('kernel.debug', false); + $container->setParameter('kernel.name', 'app'); + $container->setParameter('kernel.environment', 'prod'); + $container->setParameter('kernel.root_dir', 'foo'); $publicPool = new Definition(); $publicPool->addArgument('namespace'); diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Compiler/CachePoolPassTest.php b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Compiler/CachePoolPassTest.php index 53cb95837f7e8..192e1493d0c38 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Compiler/CachePoolPassTest.php +++ b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Compiler/CachePoolPassTest.php @@ -29,6 +29,10 @@ protected function setUp() public function testNamespaceArgumentIsReplaced() { $container = new ContainerBuilder(); + $container->setParameter('kernel.debug', false); + $container->setParameter('kernel.name', 'app'); + $container->setParameter('kernel.environment', 'prod'); + $container->setParameter('kernel.root_dir', 'foo'); $adapter = new Definition(); $adapter->setAbstract(true); $adapter->addTag('cache.pool'); @@ -41,12 +45,16 @@ public function testNamespaceArgumentIsReplaced() $this->cachePoolPass->process($container); - $this->assertSame('kRFqMp5odS', $cachePool->getArgument(0)); + $this->assertSame('C42Pcl9VBJ', $cachePool->getArgument(0)); } public function testArgsAreReplaced() { $container = new ContainerBuilder(); + $container->setParameter('kernel.debug', false); + $container->setParameter('kernel.name', 'app'); + $container->setParameter('kernel.environment', 'prod'); + $container->setParameter('cache.prefix.seed', 'foo'); $cachePool = new Definition(); $cachePool->addTag('cache.pool', array( 'provider' => 'foobar', @@ -61,7 +69,7 @@ public function testArgsAreReplaced() $this->assertInstanceOf(Reference::class, $cachePool->getArgument(0)); $this->assertSame('foobar', (string) $cachePool->getArgument(0)); - $this->assertSame('kRFqMp5odS', $cachePool->getArgument(1)); + $this->assertSame('KO3xHaFEZU', $cachePool->getArgument(1)); $this->assertSame(3, $cachePool->getArgument(2)); } @@ -72,6 +80,10 @@ public function testArgsAreReplaced() public function testThrowsExceptionWhenCachePoolTagHasUnknownAttributes() { $container = new ContainerBuilder(); + $container->setParameter('kernel.debug', false); + $container->setParameter('kernel.name', 'app'); + $container->setParameter('kernel.environment', 'prod'); + $container->setParameter('kernel.root_dir', 'foo'); $adapter = new Definition(); $adapter->setAbstract(true); $adapter->addTag('cache.pool');