From 6b57ea996cc165d7d041311e52ebf1647da1cb99 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Deruss=C3=A9?= Date: Sat, 6 Apr 2019 21:19:32 +0200 Subject: [PATCH] Use env variable to create anytype of lock store --- .../Component/Lock/Store/StoreFactory.php | 22 ++++++- .../Lock/Tests/Store/StoreFactoryTest.php | 58 +++++++++++++++++++ 2 files changed, 77 insertions(+), 3 deletions(-) create mode 100644 src/Symfony/Component/Lock/Tests/Store/StoreFactoryTest.php diff --git a/src/Symfony/Component/Lock/Store/StoreFactory.php b/src/Symfony/Component/Lock/Store/StoreFactory.php index 5f97a8715df3..a7c8168d8d56 100644 --- a/src/Symfony/Component/Lock/Store/StoreFactory.php +++ b/src/Symfony/Component/Lock/Store/StoreFactory.php @@ -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 @@ 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 @@ public static function createStore($connection) 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)); + } } } diff --git a/src/Symfony/Component/Lock/Tests/Store/StoreFactoryTest.php b/src/Symfony/Component/Lock/Tests/Store/StoreFactoryTest.php new file mode 100644 index 000000000000..cd93a8cc9f8a --- /dev/null +++ b/src/Symfony/Component/Lock/Tests/Store/StoreFactoryTest.php @@ -0,0 +1,58 @@ + + * + * 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é + */ +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]; + } + } +}