diff --git a/src/Symfony/Component/Cache/Adapter/AbstractAdapter.php b/src/Symfony/Component/Cache/Adapter/AbstractAdapter.php index 883a94ba9bae..51c4b6664c74 100644 --- a/src/Symfony/Component/Cache/Adapter/AbstractAdapter.php +++ b/src/Symfony/Component/Cache/Adapter/AbstractAdapter.php @@ -29,12 +29,14 @@ abstract class AbstractAdapter implements AdapterInterface, CacheInterface, Logg use AbstractAdapterTrait; use ContractsTrait; + protected const NS_SEPARATOR = ':'; + private static $apcuSupported; private static $phpFilesSupported; protected function __construct(string $namespace = '', int $defaultLifetime = 0) { - $this->namespace = '' === $namespace ? '' : CacheItem::validateKey($namespace).':'; + $this->namespace = '' === $namespace ? '' : CacheItem::validateKey($namespace).static::NS_SEPARATOR; if (null !== $this->maxIdLength && \strlen($namespace) > $this->maxIdLength - 24) { throw new InvalidArgumentException(sprintf('Namespace must be %d chars max, %d given ("%s")', $this->maxIdLength - 24, \strlen($namespace), $namespace)); } diff --git a/src/Symfony/Component/Cache/Adapter/Psr16Adapter.php b/src/Symfony/Component/Cache/Adapter/Psr16Adapter.php index a14ee082be1e..ffe68b7c7a5b 100644 --- a/src/Symfony/Component/Cache/Adapter/Psr16Adapter.php +++ b/src/Symfony/Component/Cache/Adapter/Psr16Adapter.php @@ -25,6 +25,8 @@ class Psr16Adapter extends AbstractAdapter implements PruneableInterface, Resett { use ProxyTrait; + protected const NS_SEPARATOR = '_'; + private $miss; public function __construct(CacheInterface $pool, string $namespace = '', int $defaultLifetime = 0) diff --git a/src/Symfony/Component/Cache/Tests/Adapter/Psr16AdapterTest.php b/src/Symfony/Component/Cache/Tests/Adapter/Psr16AdapterTest.php index 19907ddf7873..e67a9962ec6d 100644 --- a/src/Symfony/Component/Cache/Tests/Adapter/Psr16AdapterTest.php +++ b/src/Symfony/Component/Cache/Tests/Adapter/Psr16AdapterTest.php @@ -14,6 +14,7 @@ use Symfony\Component\Cache\Adapter\FilesystemAdapter; use Symfony\Component\Cache\Adapter\Psr16Adapter; use Symfony\Component\Cache\Psr16Cache; +use Symfony\Component\Debug\BufferingLogger; /** * @group time-sensitive @@ -28,4 +29,20 @@ public function createCachePool($defaultLifetime = 0) { return new Psr16Adapter(new Psr16Cache(new FilesystemAdapter()), '', $defaultLifetime); } + + public function testValidCacheKeyWithNamespace() + { + $logger = new BufferingLogger(); + $cache = new Psr16Adapter(new Psr16Cache(new FilesystemAdapter()), 'some_namespace', 0); + $cache->setLogger($logger); + $this->assertSame('foo', $cache->get('my_key', function () { + return 'foo'; + })); + $logs = $logger->cleanLogs(); + foreach ($logs as $log) { + if ('warning' === $log[0] || 'error' === $log[0]) { + $this->fail('An error was triggered while caching key with a namespace: '.$log[1]); + } + } + } } diff --git a/src/Symfony/Component/Cache/composer.json b/src/Symfony/Component/Cache/composer.json index 05bed1cf7548..d3ab17689cdb 100644 --- a/src/Symfony/Component/Cache/composer.json +++ b/src/Symfony/Component/Cache/composer.json @@ -35,6 +35,7 @@ "predis/predis": "~1.1", "psr/simple-cache": "^1.0", "symfony/config": "~4.2", + "symfony/debug": "^4", "symfony/dependency-injection": "~3.4|~4.1", "symfony/var-dumper": "^4.1.1" },