Kaynağa Gözat

Map URI schemes to connection classes.

Daniele Alessandri 15 yıl önce
ebeveyn
işleme
2543bb30cc
1 değiştirilmiş dosya ile 37 ekleme ve 6 silme
  1. 37 6
      lib/Predis.php

+ 37 - 6
lib/Predis.php

@@ -113,7 +113,7 @@ class Client {
 
 
     private function createConnection($parameters) {
     private function createConnection($parameters) {
         $params     = new ConnectionParameters($parameters);
         $params     = new ConnectionParameters($parameters);
-        $connection = $this->createConnectionInstance($params);
+        $connection = Connection::create($params, $this->_responseReader);
 
 
         if ($params->password !== null) {
         if ($params->password !== null) {
             $connection->pushInitCommand($this->createCommand(
             $connection->pushInitCommand($this->createCommand(
@@ -129,11 +129,6 @@ class Client {
         return $connection;
         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) {
     private function setConnection(IConnection $connection) {
         $this->_connection = $connection;
         $this->_connection = $connection;
     }
     }
@@ -1102,6 +1097,42 @@ interface IConnectionCluster extends IConnection {
     public function getConnectionById($connectionId);
     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 {
 class TcpConnection implements IConnectionSingle {
     private $_params, $_socket, $_initCmds, $_reader;
     private $_params, $_socket, $_initCmds, $_reader;