Use env variable to create anytype of lock store

This commit is contained in:
Jérémy Derussé 2019-04-06 21:19:32 +02:00
parent 4c78e60ad5
commit 6b57ea996c
No known key found for this signature in database
GPG Key ID: 2083FA5758C473D2
2 changed files with 77 additions and 3 deletions

View File

@ -11,9 +11,11 @@
namespace Symfony\Component\Lock\Store;
use Symfony\Component\Cache\Adapter\AbstractAdapter;
use Symfony\Component\Cache\Traits\RedisClusterProxy;
use Symfony\Component\Cache\Traits\RedisProxy;
use Symfony\Component\Lock\Exception\InvalidArgumentException;
use Symfony\Component\Lock\StoreInterface;
/**
* StoreFactory create stores and connections.
@ -23,9 +25,9 @@ use Symfony\Component\Lock\Exception\InvalidArgumentException;
class StoreFactory
{
/**
* @param \Redis|\RedisArray|\RedisCluster|\Predis\Client|\Memcached|\Zookeeper $connection
* @param \Redis|\RedisArray|\RedisCluster|\Predis\Client|\Memcached|\Zookeeper|string $connection Connection or DSN or Store short name
*
* @return RedisStore|MemcachedStore|ZookeeperStore
* @return StoreInterface
*/
public static function createStore($connection)
{
@ -45,7 +47,21 @@ class StoreFactory
if ($connection instanceof \Zookeeper) {
return new ZookeeperStore($connection);
}
if (!\is_string($connection)) {
throw new InvalidArgumentException(sprintf('Unsupported Connection: %s.', \get_class($connection)));
}
throw new InvalidArgumentException(sprintf('Unsupported Connection: %s.', \get_class($connection)));
switch (true) {
case 'flock' === $connection:
return new FlockStore();
case 0 === strpos($connection, 'flock://'):
return new FlockStore(substr($connection, 8));
case 'semaphore' === $connection:
return new SemaphoreStore();
case preg_match('#^[a-z]++://#', $connection):
return static::createStore(AbstractAdapter::createConnection($connection));
default:
throw new InvalidArgumentException(sprintf('Unsupported Connection: %s.', $connection));
}
}
}

View File

@ -0,0 +1,58 @@
<?php
/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Component\Lock\Tests\Store;
use PHPUnit\Framework\TestCase;
use Symfony\Component\Cache\Traits\RedisProxy;
use Symfony\Component\Lock\Store\FlockStore;
use Symfony\Component\Lock\Store\MemcachedStore;
use Symfony\Component\Lock\Store\RedisStore;
use Symfony\Component\Lock\Store\SemaphoreStore;
use Symfony\Component\Lock\Store\StoreFactory;
use Symfony\Component\Lock\Store\ZookeeperStore;
/**
* @author Jérémy Derussé <jeremy@derusse.com>
*/
class StoreFactoryTest extends TestCase
{
/**
* @dataProvider validConnections
*/
public function testCreateStore($connection, string $expectedStoreClass)
{
$store = StoreFactory::createStore($connection);
$this->assertInstanceOf($expectedStoreClass, $store);
}
public function validConnections()
{
if (\class_exists(\Redis::class)) {
yield [$this->createMock(\Redis::class), RedisStore::class];
}
yield [$this->createMock(RedisProxy::class), RedisStore::class];
yield [$this->createMock(\Predis\Client::class), RedisStore::class];
if (\class_exists(\Memcached::class)) {
yield [$this->createMock(\Memcached::class), MemcachedStore::class];
}
if (\class_exists(\Zookeeper::class)) {
yield [$this->createMock(\Zookeeper::class), ZookeeperStore::class];
}
yield ['flock', FlockStore::class];
yield ['flock:///tmp', FlockStore::class];
yield ['semaphore', SemaphoreStore::class];
if (\class_exists(\Memcached::class)) {
yield ['memcached://server.com', MemcachedStore::class];
}
}
}