Merge pull request #10776 from creative-commoners/pulls/5.0/acpu-memcached-factories

FIX Get ApcuCacheFactory and MemcachedCacheFactory working again
This commit is contained in:
Guy Sartorelli 2023-05-17 10:53:26 +12:00 committed by GitHub
commit 58813d5075
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 32 additions and 24 deletions

View File

@ -3,12 +3,11 @@
namespace SilverStripe\Core\Cache; namespace SilverStripe\Core\Cache;
use SilverStripe\Core\Injector\Injector; use SilverStripe\Core\Injector\Injector;
use Symfony\Component\Cache\Simple\ApcuCache; use Symfony\Component\Cache\Adapter\ApcuAdapter;
use Memcached; use Symfony\Component\Cache\Psr16Cache;
class ApcuCacheFactory implements CacheFactory class ApcuCacheFactory implements CacheFactory
{ {
/** /**
* @var string * @var string
*/ */
@ -31,10 +30,11 @@ class ApcuCacheFactory implements CacheFactory
? $params['namespace'] . '_' . md5(BASE_PATH) ? $params['namespace'] . '_' . md5(BASE_PATH)
: md5(BASE_PATH); : md5(BASE_PATH);
$defaultLifetime = isset($params['defaultLifetime']) ? $params['defaultLifetime'] : 0; $defaultLifetime = isset($params['defaultLifetime']) ? $params['defaultLifetime'] : 0;
return Injector::inst()->createWithArgs(ApcuCache::class, [ $psr6Cache = Injector::inst()->createWithArgs(ApcuAdapter::class, [
$namespace, $namespace,
$defaultLifetime, $defaultLifetime,
$this->version $this->version
]); ]);
return Injector::inst()->createWithArgs(Psr16Cache::class, [$psr6Cache]);
} }
} }

View File

@ -3,7 +3,8 @@
namespace SilverStripe\Core\Cache; namespace SilverStripe\Core\Cache;
use SilverStripe\Core\Injector\Injector; use SilverStripe\Core\Injector\Injector;
use Symfony\Component\Cache\Simple\MemcachedCache; use Symfony\Component\Cache\Adapter\MemcachedAdapter;
use Symfony\Component\Cache\Psr16Cache;
use Memcached; use Memcached;
class MemcachedCacheFactory implements CacheFactory class MemcachedCacheFactory implements CacheFactory
@ -31,10 +32,11 @@ class MemcachedCacheFactory implements CacheFactory
? $params['namespace'] . '_' . md5(BASE_PATH) ? $params['namespace'] . '_' . md5(BASE_PATH)
: md5(BASE_PATH); : md5(BASE_PATH);
$defaultLifetime = isset($params['defaultLifetime']) ? $params['defaultLifetime'] : 0; $defaultLifetime = isset($params['defaultLifetime']) ? $params['defaultLifetime'] : 0;
return Injector::inst()->createWithArgs(MemcachedCache::class, [ $psr6Cache = Injector::inst()->createWithArgs(MemcachedAdapter::class, [
$this->memcachedClient, $this->memcachedClient,
$namespace, $namespace,
$defaultLifetime $defaultLifetime
]); ]);
return Injector::inst()->createWithArgs(Psr16Cache::class, [$psr6Cache]);
} }
} }

View File

@ -2,14 +2,17 @@
namespace SilverStripe\Core\Tests\Cache; namespace SilverStripe\Core\Tests\Cache;
use Behat\Gherkin\Cache\MemoryCache;
use Psr\SimpleCache\CacheInterface; use Psr\SimpleCache\CacheInterface;
use SilverStripe\Core\Cache\ApcuCacheFactory; use SilverStripe\Core\Cache\ApcuCacheFactory;
use SilverStripe\Core\Cache\MemcachedCacheFactory; use SilverStripe\Core\Cache\MemcachedCacheFactory;
use SilverStripe\Core\Injector\Injector; use SilverStripe\Core\Injector\Injector;
use SilverStripe\Core\Tests\Cache\CacheTest\MockCache; use SilverStripe\Core\Tests\Cache\CacheTest\MockCache;
use SilverStripe\Dev\SapphireTest; use SilverStripe\Dev\SapphireTest;
use Symfony\Component\Cache\Simple\ApcuCache; use Symfony\Component\Cache\Psr16Cache;
use Symfony\Component\Cache\Simple\MemcachedCache; use Symfony\Component\Cache\Adapter\ApcuAdapter;
use Symfony\Component\Cache\Adapter\MemcachedAdapter;
use Memcached;
class CacheTest extends SapphireTest class CacheTest extends SapphireTest
{ {
@ -22,7 +25,10 @@ class CacheTest extends SapphireTest
ApcuCacheFactory::class => [ ApcuCacheFactory::class => [
'constructor' => [ 'version' => 'ss40test' ] 'constructor' => [ 'version' => 'ss40test' ]
], ],
MemcachedCacheFactory::class => MemcachedCacheFactory::class, 'MemcachedClient' => Memcached::class,
MemcachedCacheFactory::class => [
'constructor' => [ 'memcachedClient' => '%$MemcachedClient' ]
],
CacheInterface::class . '.TestApcuCache' => [ CacheInterface::class . '.TestApcuCache' => [
'factory' => ApcuCacheFactory::class, 'factory' => ApcuCacheFactory::class,
'constructor' => [ 'constructor' => [
@ -37,42 +43,42 @@ class CacheTest extends SapphireTest
'defaultLifetime' => 5600, 'defaultLifetime' => 5600,
], ],
], ],
ApcuCache::class => MockCache::class, Psr16Cache::class => MockCache::class,
MemcachedCache::class => MockCache::class, ApcuAdapter::class => MockCache::class,
MemcachedAdapter::class => MockCache::class,
]); ]);
} }
public function testApcuCacheFactory() public function testApcuCacheFactory()
{ {
$cache = Injector::inst()->get(CacheInterface::class . '.TestApcuCache'); $psr16Cache = Injector::inst()->get(CacheInterface::class . '.TestApcuCache');
$this->assertInstanceOf( $this->assertInstanceOf(MockCache::class, $psr16Cache);
MockCache::class, $this->assertEquals(MockCache::class, get_class($psr16Cache->getArgs()[0]));
$cache
);
$this->assertEquals( $this->assertEquals(
[ [
'TestApcuCache_' . md5(BASE_PATH), 'TestApcuCache_' . md5(BASE_PATH),
2600, 2600,
'ss40test' 'ss40test'
], ],
$cache->getArgs() $psr16Cache->getArgs()[0]->getArgs()
); );
} }
public function testMemCacheFactory() public function testMemCacheFactory()
{ {
$cache = Injector::inst()->get(CacheInterface::class . '.TestMemcache'); if (!class_exists(Memcached::class)) {
$this->assertInstanceOf( $this->markTestSkipped('Memcached is not installed');
MockCache::class, }
$cache $psr16Cache = Injector::inst()->get(CacheInterface::class . '.TestMemcache');
); $this->assertInstanceOf(MockCache::class, $psr16Cache);
$this->assertEquals(MockCache::class, get_class($psr16Cache->getArgs()[0]));
$this->assertEquals( $this->assertEquals(
[ [
null, new MemCached(),
'TestMemCache_' . md5(BASE_PATH), 'TestMemCache_' . md5(BASE_PATH),
5600 5600
], ],
$cache->getArgs() $psr16Cache->getArgs()[0]->getArgs()
); );
} }
} }