Skip to content

Commit

Permalink
Use env variable to create anytype of lock store
Browse files Browse the repository at this point in the history
  • Loading branch information
jderusse committed Apr 6, 2019
1 parent 4c78e60 commit 6b57ea9
Show file tree
Hide file tree
Showing 2 changed files with 77 additions and 3 deletions.
22 changes: 19 additions & 3 deletions src/Symfony/Component/Lock/Store/StoreFactory.php
Expand Up @@ -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.
Expand All @@ -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)
{
Expand All @@ -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));
}
}
}
58 changes: 58 additions & 0 deletions src/Symfony/Component/Lock/Tests/Store/StoreFactoryTest.php
@@ -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];
}
}
}

0 comments on commit 6b57ea9

Please sign in to comment.