BUG Fix ApcuCache and MemCache namespace

This commit is contained in:
Damian Mooyman 2017-05-03 09:54:14 +12:00
parent 0c52ea067c
commit 8b9f41d4f4
5 changed files with 130 additions and 8 deletions

View File

@ -27,9 +27,13 @@ class ApcuCacheFactory implements CacheFactory
*/
public function create($service, array $params = array())
{
return Injector::inst()->create(ApcuCache::class, false, [
(isset($args['namespace'])) ? $args['namespace'] : '',
(isset($args['defaultLifetime'])) ? $args['defaultLifetime'] : 0,
$namespace = isset($params['namespace'])
? $params['namespace'] . '_' . md5(BASE_PATH)
: md5(BASE_PATH);
$defaultLifetime = isset($params['defaultLifetime']) ? $params['defaultLifetime'] : 0;
return Injector::inst()->createWithArgs(ApcuCache::class, [
$namespace,
$defaultLifetime,
$this->version
]);
}

View File

@ -71,7 +71,8 @@ class DefaultCacheFactory implements CacheFactory
}
// Chain this cache with ApcuCache
$apcu = $this->createCache(ApcuCache::class, [$namespace, (int) $defaultLifetime / 5, $version]);
$apcuNamespace = $namespace . ($namespace ? '_' : '') . md5(BASE_PATH);
$apcu = $this->createCache(ApcuCache::class, [$apcuNamespace, (int) $defaultLifetime / 5, $version]);
return $this->createCache(ChainCache::class, [[$apcu, $fs]]);
}

View File

@ -17,7 +17,7 @@ class MemcachedCacheFactory implements CacheFactory
/**
* @param Memcached $memcachedClient
*/
public function __construct(Memcached $memcachedClient)
public function __construct(Memcached $memcachedClient = null)
{
$this->memcachedClient = $memcachedClient;
}
@ -27,10 +27,14 @@ class MemcachedCacheFactory implements CacheFactory
*/
public function create($service, array $params = array())
{
return Injector::inst()->create(MemcachedCache::class, false, [
$namespace = isset($params['namespace'])
? $params['namespace'] . '_' . md5(BASE_PATH)
: md5(BASE_PATH);
$defaultLifetime = isset($params['defaultLifetime']) ? $params['defaultLifetime'] : 0;
return Injector::inst()->createWithArgs(MemcachedCache::class, [
$this->memcachedClient,
(isset($args['namespace'])) ? $args['namespace'] : '',
(isset($args['defaultLifetime'])) ? $args['defaultLifetime'] : 0
$namespace,
$defaultLifetime
]);
}
}

View File

@ -0,0 +1,88 @@
<?php
namespace SilverStripe\Core\Tests\Cache;
use Psr\SimpleCache\CacheInterface;
use SilverStripe\Core\Cache\ApcuCacheFactory;
use SilverStripe\Core\Cache\MemcachedCacheFactory;
use SilverStripe\Core\Config\Config;
use SilverStripe\Core\Injector\Injector;
use SilverStripe\Core\Test\Cache\CacheTest\MockCache;
use SilverStripe\Dev\SapphireTest;
use Symfony\Component\Cache\Simple\ApcuCache;
use Symfony\Component\Cache\Simple\MemcachedCache;
class CacheTest extends SapphireTest
{
protected function setUp()
{
parent::setUp();
Config::modify()
->set(
Injector::class,
ApcuCacheFactory::class,
[
'constructor' => [ 'version' => 4400 ]
]
)
->set(
Injector::class,
CacheInterface::class . '.TestApcuCache',
[
'factory' => ApcuCacheFactory::class,
'constructor' => [
'namespace' => 'TestApcuCache',
'defaultLifetime' => 2600,
],
]
)
->set(
Injector::class,
CacheInterface::class . '.TestMemcache',
[
'factory' => MemcachedCacheFactory::class,
'constructor' => [
'namespace' => 'TestMemCache',
'defaultLifetime' => 5600,
],
]
)
->set(Injector::class, ApcuCache::class, MockCache::class)
->set(Injector::class, MemcachedCache::class, MockCache::class);
}
public function testApcuCacheFactory()
{
$cache = Injector::inst()->get(CacheInterface::class .'.TestApcuCache');
$this->assertInstanceOf(
MockCache::class,
$cache
);
$this->assertEquals(
[
'TestApcuCache_'.md5(BASE_PATH),
2600,
4400
],
$cache->getArgs()
);
}
public function testMemCacheFactory()
{
$cache = Injector::inst()->get(CacheInterface::class .'.TestMemcache');
$this->assertInstanceOf(
MockCache::class,
$cache
);
$this->assertEquals(
[
null,
'TestMemCache_'.md5(BASE_PATH),
5600
],
$cache->getArgs()
);
}
}

View File

@ -0,0 +1,25 @@
<?php
namespace SilverStripe\Core\Test\Cache\CacheTest;
use SilverStripe\Dev\TestOnly;
class MockCache implements TestOnly
{
protected $args = [];
public function __construct()
{
$this->args = func_get_args();
}
/**
* Get constructor args
*
* @return array
*/
public function getArgs()
{
return $this->args;
}
}