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;
|
||||
|
||||
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));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
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