Use env variable to create anytype of lock store
This commit is contained in:
parent
4c78e60ad5
commit
6b57ea996c
@ -11,9 +11,11 @@
|
|||||||
|
|
||||||
namespace Symfony\Component\Lock\Store;
|
namespace Symfony\Component\Lock\Store;
|
||||||
|
|
||||||
|
use Symfony\Component\Cache\Adapter\AbstractAdapter;
|
||||||
use Symfony\Component\Cache\Traits\RedisClusterProxy;
|
use Symfony\Component\Cache\Traits\RedisClusterProxy;
|
||||||
use Symfony\Component\Cache\Traits\RedisProxy;
|
use Symfony\Component\Cache\Traits\RedisProxy;
|
||||||
use Symfony\Component\Lock\Exception\InvalidArgumentException;
|
use Symfony\Component\Lock\Exception\InvalidArgumentException;
|
||||||
|
use Symfony\Component\Lock\StoreInterface;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* StoreFactory create stores and connections.
|
* StoreFactory create stores and connections.
|
||||||
@ -23,9 +25,9 @@ use Symfony\Component\Lock\Exception\InvalidArgumentException;
|
|||||||
class StoreFactory
|
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)
|
public static function createStore($connection)
|
||||||
{
|
{
|
||||||
@ -45,7 +47,21 @@ class StoreFactory
|
|||||||
if ($connection instanceof \Zookeeper) {
|
if ($connection instanceof \Zookeeper) {
|
||||||
return new ZookeeperStore($connection);
|
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));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
58
src/Symfony/Component/Lock/Tests/Store/StoreFactoryTest.php
Normal file
58
src/Symfony/Component/Lock/Tests/Store/StoreFactoryTest.php
Normal 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];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Reference in New Issue
Block a user