|
11 | 11 |
|
12 | 12 | namespace Symfony\Component\Cache\Traits;
|
13 | 13 |
|
| 14 | +use function is_array; |
14 | 15 | use Predis\Connection\Aggregate\ClusterInterface;
|
15 | 16 | use Predis\Connection\Aggregate\PredisCluster;
|
16 | 17 | use Predis\Connection\Aggregate\RedisCluster;
|
@@ -119,7 +120,20 @@ public static function createConnection($dsn, array $options = array())
|
119 | 120 | if (null === $params['class'] && !\extension_loaded('redis') && !class_exists(\Predis\Client::class)) {
|
120 | 121 | throw new CacheException(sprintf('Cannot find the "redis" extension, and "predis/predis" is not installed: %s', $dsn));
|
121 | 122 | }
|
122 |
| - $class = null === $params['class'] ? (\extension_loaded('redis') ? \Redis::class : \Predis\Client::class) : $params['class']; |
| 123 | + |
| 124 | + if (isset($params['predis_options']) && !class_exists(\Predis\Client::class)) { |
| 125 | + throw new InvalidArgumentException('Invalid connection option: "predis_options" provided but "predis/predis" is not installed.'); |
| 126 | + } |
| 127 | + |
| 128 | + if (isset($params['predis_options']) && null !== $params['class'] && !is_a($params['class'], \Predis\Client::class, true)) { |
| 129 | + throw new InvalidArgumentException(sprintf('Invalid connection option: "predis_options" provided but provided class "%s" is not an instance of \Predis\Client', $params['class'])); |
| 130 | + } |
| 131 | + |
| 132 | + if (isset($params['predis_options'])) { |
| 133 | + $class = $params['class'] ?? \Predis\Client::class; |
| 134 | + } else { |
| 135 | + $class = $params['class'] ?? (\extension_loaded('redis') ? \Redis::class : \Predis\Client::class); |
| 136 | + } |
123 | 137 |
|
124 | 138 | if (is_a($class, \Redis::class, true)) {
|
125 | 139 | $connect = $params['persistent'] || $params['persistent_id'] ? 'pconnect' : 'connect';
|
@@ -167,7 +181,14 @@ public static function createConnection($dsn, array $options = array())
|
167 | 181 | $params['scheme'] = $scheme;
|
168 | 182 | $params['database'] = $params['dbindex'] ?: null;
|
169 | 183 | $params['password'] = $auth;
|
170 |
| - $redis = new $class((new Factory())->create($params)); |
| 184 | + |
| 185 | + $predisOptions = $params['predis_options'] ?? array(); |
| 186 | + |
| 187 | + if (!\is_array($predisOptions)) { |
| 188 | + throw new InvalidArgumentException('Invalid connection option: "predis_options" provided but is not of the type "array".'); |
| 189 | + } |
| 190 | + |
| 191 | + $redis = new $class((new Factory())->create($params), $predisOptions); |
171 | 192 | } elseif (class_exists($class, false)) {
|
172 | 193 | throw new InvalidArgumentException(sprintf('"%s" is not a subclass of "Redis" or "Predis\Client"', $class));
|
173 | 194 | } else {
|
|
0 commit comments