浏览代码

Map URI schemes to connection classes.

Daniele Alessandri 15 年之前
父节点
当前提交
2543bb30cc
共有 1 个文件被更改,包括 37 次插入6 次删除
  1. 37 6
      lib/Predis.php

+ 37 - 6
lib/Predis.php

@@ -113,7 +113,7 @@ class Client {
 
     private function createConnection($parameters) {
         $params     = new ConnectionParameters($parameters);
-        $connection = $this->createConnectionInstance($params);
+        $connection = Connection::create($params, $this->_responseReader);
 
         if ($params->password !== null) {
             $connection->pushInitCommand($this->createCommand(
@@ -129,11 +129,6 @@ class Client {
         return $connection;
     }
 
-    private function createConnectionInstance(ConnectionParameters $parameters) {
-        // TODO: check scheme and return the appropriate IConnectionSingle instance
-        return new TcpConnection($parameters, $this->_responseReader);
-    }
-
     private function setConnection(IConnection $connection) {
         $this->_connection = $connection;
     }
@@ -1102,6 +1097,42 @@ interface IConnectionCluster extends IConnection {
     public function getConnectionById($connectionId);
 }
 
+class Connection {
+    private static $_registeredSchemes;
+
+    private static function ensureInitialized() {
+        if (!isset(self::$_registeredSchemes)) {
+            self::$_registeredSchemes = self::getDefaultSchemes();
+        }
+    }
+
+    private static function getDefaultSchemes() {
+        return array(
+            'tcp' => '\Predis\TcpConnection',
+        );
+    }
+
+    public static function registerScheme($scheme, $connectionClass) {
+        self::ensureInitialized();
+        $connectionReflection = new \ReflectionClass($connectionClass);
+        if (!$connectionReflection->isSubclassOf('\Predis\IConnectionSingle')) {
+            throw new ClientException(
+                "Cannot register '$connectionClass' as it is not a valid connection class"
+            );
+        }
+        self::$_registeredSchemes[$scheme] = $connectionClass;
+    }
+
+    public static function create(ConnectionParameters $parameters, ResponseReader $reader) {
+        self::ensureInitialized();
+        if (!isset(self::$_registeredSchemes[$parameters->scheme])) {
+            throw new ClientException("Unknown connection scheme: {$parameters->scheme}");
+        }
+        $connection = self::$_registeredSchemes[$parameters->scheme];
+        return new $connection($parameters, $reader);
+    }
+}
+
 class TcpConnection implements IConnectionSingle {
     private $_params, $_socket, $_initCmds, $_reader;