Pārlūkot izejas kodu

Rewrite Predis\ConnectionParams to leverage the Predis\Options namespace.

Daniele Alessandri 14 gadi atpakaļ
vecāks
revīzija
131e4c9d03
1 mainītis faili ar 66 papildinājumiem un 28 dzēšanām
  1. 66 28
      lib/Predis.php

+ 66 - 28
lib/Predis.php

@@ -856,18 +856,14 @@ final class ConnectionFactory {
 }
 
 class ConnectionParameters {
-    const DEFAULT_SCHEME = 'tcp';
-    const DEFAULT_HOST = '127.0.0.1';
-    const DEFAULT_PORT = 6379;
-    const DEFAULT_TIMEOUT = 5;
-
     private $_parameters;
+    private static $_sharedOptions;
 
     public function __construct($parameters = null) {
         $parameters = $parameters ?: array();
         $this->_parameters = is_array($parameters)
-            ? self::filterConnectionParams($parameters)
-            : self::parseURI($parameters);
+            ? $this->filter($parameters)
+            : $this->parseURI($parameters);
     }
 
     private static function paramsExtractor($params, $kv) {
@@ -876,7 +872,45 @@ class ConnectionParameters {
         return $params;
     }
 
-    private static function parseURI($uri) {
+    private static function getSharedOptions() {
+        if (isset(self::$_sharedOptions)) {
+            return self::$_sharedOptions;
+        }
+
+        $optEmpty   = new Options\Option();
+        $optBoolean = new Options\CustomOption(array(
+            'validate' => function($value) { return (bool) $value; },
+            'default'  => function() { return false; },
+        ));
+
+        self::$_sharedOptions = array(
+            'scheme' => new Options\CustomOption(array(
+                'default'  => function() { return 'tcp'; },
+            )),
+            'host' => new Options\CustomOption(array(
+                'default'  => function() { return '127.0.0.1'; },
+            )),
+            'port' => new Options\CustomOption(array(
+                'validate' => function($value) { return (int) $value; },
+                'default'  => function() { return 6379; },
+            )),
+            'path' => $optEmpty,
+            'database' => $optEmpty,
+            'password' => $optEmpty,
+            'connection_async' => $optBoolean,
+            'connection_persistent' => $optBoolean,
+            'connection_timeout' => new Options\CustomOption(array(
+                'default'  => function() { return 5; },
+            )),
+            'read_write_timeout' => $optEmpty,
+            'alias' => $optEmpty,
+            'weight' => $optEmpty,
+        );
+
+        return self::$_sharedOptions;
+    }
+
+    protected function parseURI($uri) {
         if (stripos($uri, 'unix') === 0) {
             // Hack to support URIs for UNIX sockets with minimal effort
             $uri = str_ireplace('unix:///', 'unix://localhost/', $uri);
@@ -889,36 +923,40 @@ class ConnectionParameters {
             $query  = explode('&', $parsed['query']);
             $parsed = array_reduce($query, 'self::paramsExtractor', $parsed);
         }
-        return self::filterConnectionParams($parsed);
+        return $this->filter($parsed);
     }
 
-    private static function getParamOrDefault(Array $parameters, $param, $default = null) {
-        return array_key_exists($param, $parameters) ? $parameters[$param] : $default;
+    protected function filter($parameters) {
+        $handlers = self::getSharedOptions();
+        foreach ($parameters as $parameter => $value) {
+            if (isset($handlers[$parameter])) {
+                $parameters[$parameter] = $handlers[$parameter]($value);
+            }
+        }
+        return $parameters;
     }
 
-    private static function filterConnectionParams($parameters) {
-        return array(
-            'scheme' => self::getParamOrDefault($parameters, 'scheme', self::DEFAULT_SCHEME),
-            'host' => self::getParamOrDefault($parameters, 'host', self::DEFAULT_HOST),
-            'port' => (int) self::getParamOrDefault($parameters, 'port', self::DEFAULT_PORT),
-            'path' => self::getParamOrDefault($parameters, 'path'),
-            'database' => self::getParamOrDefault($parameters, 'database'),
-            'password' => self::getParamOrDefault($parameters, 'password'),
-            'connection_async'   => self::getParamOrDefault($parameters, 'connection_async', false),
-            'connection_persistent' => self::getParamOrDefault($parameters, 'connection_persistent', false),
-            'connection_timeout' => self::getParamOrDefault($parameters, 'connection_timeout', self::DEFAULT_TIMEOUT),
-            'read_write_timeout' => self::getParamOrDefault($parameters, 'read_write_timeout'),
-            'alias'  => self::getParamOrDefault($parameters, 'alias'),
-            'weight' => self::getParamOrDefault($parameters, 'weight'),
-        );
+    private function tryInitializeValue($parameter) {
+        if (isset(self::$_sharedOptions[$parameter])) {
+            $value = self::$_sharedOptions[$parameter]->getDefault();
+            $this->_parameters[$parameter] = $value;
+            return $value;
+        }
     }
 
     public function __get($parameter) {
-        return $this->_parameters[$parameter];
+        if (isset($this->_parameters[$parameter])) {
+            return $this->_parameters[$parameter];
+        }
+        return $this->tryInitializeValue($parameter);
     }
 
     public function __isset($parameter) {
-        return isset($this->_parameters[$parameter]);
+        if (isset($this->_parameters[$parameter])) {
+            return true;
+        }
+        $value = $this->tryInitializeValue($parameter);
+        return isset($value);
     }
 }