From 847b196c7bf3cadae09ce9ebb6d4a2a4664518d2 Mon Sep 17 00:00:00 2001 From: paulhenri-l <25308170+paulhenri-l@users.noreply.github.com> Date: Wed, 24 Jul 2019 00:11:41 +0200 Subject: [PATCH 1/6] Add support for custom drivers This portion of code is heavily inspired by the CacheManager extension system. --- src/Illuminate/Contracts/Redis/Connector.php | 25 +++++++++++++++++ src/Illuminate/Redis/RedisManager.php | 29 +++++++++++++++++++- 2 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 src/Illuminate/Contracts/Redis/Connector.php diff --git a/src/Illuminate/Contracts/Redis/Connector.php b/src/Illuminate/Contracts/Redis/Connector.php new file mode 100644 index 000000000000..10d4fecce3b9 --- /dev/null +++ b/src/Illuminate/Contracts/Redis/Connector.php @@ -0,0 +1,25 @@ +customCreators[$this->driver] ?? null; + + if ($customCreator) { + return call_user_func($customCreator); + } + switch ($this->driver) { case 'predis': return new Connectors\PredisConnector; @@ -215,6 +228,20 @@ public function setDriver($driver) $this->driver = $driver; } + /** + * Register a custom driver creator Closure. + * + * @param string $driver + * @param \Closure $callback + * @return $this + */ + public function extend($driver, \Closure $callback) + { + $this->customCreators[$driver] = $callback->bindTo($this, $this); + + return $this; + } + /** * Pass methods onto the default Redis connection. * From 45dd2c9ac9900827b39dc0b31034ab836068ae37 Mon Sep 17 00:00:00 2001 From: paulhenri-l <25308170+paulhenri-l@users.noreply.github.com> Date: Wed, 24 Jul 2019 00:12:33 +0200 Subject: [PATCH 2/6] Adhere to the newly created contract --- src/Illuminate/Redis/Connectors/PhpRedisConnector.php | 3 ++- src/Illuminate/Redis/Connectors/PredisConnector.php | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/Illuminate/Redis/Connectors/PhpRedisConnector.php b/src/Illuminate/Redis/Connectors/PhpRedisConnector.php index 5452ae69fcd3..dbf5c791c6d6 100644 --- a/src/Illuminate/Redis/Connectors/PhpRedisConnector.php +++ b/src/Illuminate/Redis/Connectors/PhpRedisConnector.php @@ -2,13 +2,14 @@ namespace Illuminate\Redis\Connectors; +use Illuminate\Contracts\Redis\Connector; use Redis; use RedisCluster; use Illuminate\Support\Arr; use Illuminate\Redis\Connections\PhpRedisConnection; use Illuminate\Redis\Connections\PhpRedisClusterConnection; -class PhpRedisConnector +class PhpRedisConnector implements Connector { /** * Create a new clustered PhpRedis connection. diff --git a/src/Illuminate/Redis/Connectors/PredisConnector.php b/src/Illuminate/Redis/Connectors/PredisConnector.php index 8b1a46b19de5..738d7b651ca7 100644 --- a/src/Illuminate/Redis/Connectors/PredisConnector.php +++ b/src/Illuminate/Redis/Connectors/PredisConnector.php @@ -2,12 +2,13 @@ namespace Illuminate\Redis\Connectors; +use Illuminate\Contracts\Redis\Connector; use Predis\Client; use Illuminate\Support\Arr; use Illuminate\Redis\Connections\PredisConnection; use Illuminate\Redis\Connections\PredisClusterConnection; -class PredisConnector +class PredisConnector implements Connector { /** * Create a new clustered Predis connection. From 647cca5a44ad2bd56be1969a096dbd94b18dc3c6 Mon Sep 17 00:00:00 2001 From: paulhenri-l <25308170+paulhenri-l@users.noreply.github.com> Date: Wed, 24 Jul 2019 00:38:04 +0200 Subject: [PATCH 3/6] Test the extend system --- tests/Redis/RedisManagerExtensionTest.php | 88 +++++++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 tests/Redis/RedisManagerExtensionTest.php diff --git a/tests/Redis/RedisManagerExtensionTest.php b/tests/Redis/RedisManagerExtensionTest.php new file mode 100644 index 000000000000..3608ebb38d0e --- /dev/null +++ b/tests/Redis/RedisManagerExtensionTest.php @@ -0,0 +1,88 @@ +redis = new RedisManager(new Application(), 'my_custom_driver', [ + 'default' => [ + 'host' => 'some-host', + 'port' => 'some-port', + 'database' => 5, + 'timeout' => 0.5, + ], + 'clusters' => [ + 'my-cluster' => [ + [ + 'host' => 'some-host', + 'port' => 'some-port', + 'database' => 5, + 'timeout' => 0.5, + ] + ] + ] + ]); + + $this->redis->extend('my_custom_driver', function () { + return new FakeRedisConnnector(); + }); + } + + public function test_using_custom_redis_connector_with_single_redis_instance() + { + $this->assertEquals( + 'my-redis-connection', $this->redis->resolve() + ); + } + + public function test_using_custom_redis_connector_with_redis_cluster_instance() + { + $this->assertEquals( + 'my-redis-cluster-connection', $this->redis->resolve('my-cluster') + ); + } +} + +class FakeRedisConnnector implements Connector +{ + /** + * Create a new clustered Predis connection. + * + * @param array $config + * @param array $options + * @return \Illuminate\Contracts\Redis\Connection + */ + public function connect(array $config, array $options) + { + return 'my-redis-connection'; + } + + /** + * Create a new clustered Predis connection. + * + * @param array $config + * @param array $clusterOptions + * @param array $options + * @return \Illuminate\Contracts\Redis\Connection + */ + public function connectToCluster(array $config, array $clusterOptions, array $options) + { + return 'my-redis-cluster-connection'; + } +} From 013b03990e8fcc9fa63ffc99852b1c3cb10865d5 Mon Sep 17 00:00:00 2001 From: paulhenri-l <25308170+paulhenri-l@users.noreply.github.com> Date: Wed, 24 Jul 2019 00:41:50 +0200 Subject: [PATCH 4/6] Style changes --- src/Illuminate/Contracts/Redis/Connector.php | 4 ++-- src/Illuminate/Redis/Connectors/PhpRedisConnector.php | 2 +- src/Illuminate/Redis/Connectors/PredisConnector.php | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Illuminate/Contracts/Redis/Connector.php b/src/Illuminate/Contracts/Redis/Connector.php index 10d4fecce3b9..e2a6392b0af0 100644 --- a/src/Illuminate/Contracts/Redis/Connector.php +++ b/src/Illuminate/Contracts/Redis/Connector.php @@ -5,7 +5,7 @@ interface Connector { /** - * Create a new clustered Predis connection. + * Create a new clustered redis connection. * * @param array $config * @param array $options @@ -14,7 +14,7 @@ interface Connector public function connect(array $config, array $options); /** - * Create a new clustered Predis connection. + * Create a new clustered redis connection. * * @param array $config * @param array $clusterOptions diff --git a/src/Illuminate/Redis/Connectors/PhpRedisConnector.php b/src/Illuminate/Redis/Connectors/PhpRedisConnector.php index dbf5c791c6d6..e46fa6fa977b 100644 --- a/src/Illuminate/Redis/Connectors/PhpRedisConnector.php +++ b/src/Illuminate/Redis/Connectors/PhpRedisConnector.php @@ -2,10 +2,10 @@ namespace Illuminate\Redis\Connectors; -use Illuminate\Contracts\Redis\Connector; use Redis; use RedisCluster; use Illuminate\Support\Arr; +use Illuminate\Contracts\Redis\Connector; use Illuminate\Redis\Connections\PhpRedisConnection; use Illuminate\Redis\Connections\PhpRedisClusterConnection; diff --git a/src/Illuminate/Redis/Connectors/PredisConnector.php b/src/Illuminate/Redis/Connectors/PredisConnector.php index 738d7b651ca7..e349dcd51618 100644 --- a/src/Illuminate/Redis/Connectors/PredisConnector.php +++ b/src/Illuminate/Redis/Connectors/PredisConnector.php @@ -2,9 +2,9 @@ namespace Illuminate\Redis\Connectors; -use Illuminate\Contracts\Redis\Connector; use Predis\Client; use Illuminate\Support\Arr; +use Illuminate\Contracts\Redis\Connector; use Illuminate\Redis\Connections\PredisConnection; use Illuminate\Redis\Connections\PredisClusterConnection; From ef0f8ec936ff621069b21c184bdaa80449216ff2 Mon Sep 17 00:00:00 2001 From: paulhenri-l <25308170+paulhenri-l@users.noreply.github.com> Date: Wed, 24 Jul 2019 01:09:37 +0200 Subject: [PATCH 5/6] Update RedisManagerExtensionTest.php Style changes --- tests/Redis/RedisManagerExtensionTest.php | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tests/Redis/RedisManagerExtensionTest.php b/tests/Redis/RedisManagerExtensionTest.php index 3608ebb38d0e..0c9c02cb680b 100644 --- a/tests/Redis/RedisManagerExtensionTest.php +++ b/tests/Redis/RedisManagerExtensionTest.php @@ -2,10 +2,10 @@ namespace Illuminate\Tests\Redis; -use Illuminate\Contracts\Redis\Connector; -use Illuminate\Foundation\Application; -use Illuminate\Redis\RedisManager; use PHPUnit\Framework\TestCase; +use Illuminate\Redis\RedisManager; +use Illuminate\Foundation\Application; +use Illuminate\Contracts\Redis\Connector; class RedisManagerExtensionTest extends TestCase { @@ -34,9 +34,9 @@ protected function setUp(): void 'port' => 'some-port', 'database' => 5, 'timeout' => 0.5, - ] - ] - ] + ], + ], + ], ]); $this->redis->extend('my_custom_driver', function () { From 5e3ebc53fb1d738a2bbed7991bbfd97d9222c93c Mon Sep 17 00:00:00 2001 From: paulhenri-l <25308170+paulhenri-l@users.noreply.github.com> Date: Wed, 24 Jul 2019 17:39:46 +0200 Subject: [PATCH 6/6] The interface is not enough --- src/Illuminate/Contracts/Redis/Connector.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Illuminate/Contracts/Redis/Connector.php b/src/Illuminate/Contracts/Redis/Connector.php index e2a6392b0af0..68c742c745b0 100644 --- a/src/Illuminate/Contracts/Redis/Connector.php +++ b/src/Illuminate/Contracts/Redis/Connector.php @@ -9,7 +9,7 @@ interface Connector * * @param array $config * @param array $options - * @return \Illuminate\Contracts\Redis\Connection + * @return \Illuminate\Redis\Connections\Connection */ public function connect(array $config, array $options); @@ -19,7 +19,7 @@ public function connect(array $config, array $options); * @param array $config * @param array $clusterOptions * @param array $options - * @return \Illuminate\Contracts\Redis\Connection + * @return \Illuminate\Redis\Connections\Connection */ public function connectToCluster(array $config, array $clusterOptions, array $options); }