소스 검색

Enhancement: set how to handle errors returned by the server (throw a ServerException or return a ResponseError instance that holds the error message).

Daniele Alessandri 15 년 전
부모
커밋
38e8c94f8b
1개의 변경된 파일38개의 추가작업 그리고 0개의 파일을 삭제
  1. 38 0
      lib/Predis.php

+ 38 - 0
lib/Predis.php

@@ -302,6 +302,12 @@ class ResponseErrorHandler implements IResponseHandler {
     }
 }
 
+class ResponseErrorSilentHandler implements IResponseHandler {
+    public function handle(ResponseReader $reader, $socket, $errorMessage) {
+        return new ResponseError(substr($errorMessage, 4));
+    }
+}
+
 class ResponseBulkHandler implements IResponseHandler {
     public function handle(ResponseReader $reader, $socket, $dataLength) {
         if (!is_numeric($dataLength)) {
@@ -407,6 +413,13 @@ class ResponseReader {
                     : new ResponseMultiBulkHandler()
                 );
                 break;
+            case 'errorThrowException':
+            case 'error_throw_exception':
+                $this->setHandler('-', $value == true 
+                    ? new ResponseErrorHandler()
+                    : new ResponseErrorSilentHandler()
+                );
+                break;
             default:
                 throw new \InvalidArgumentException("Unknown option: $option");
         }
@@ -437,6 +450,31 @@ class ResponseReader {
     }
 }
 
+class ResponseError {
+    private $_message;
+
+    public function __construct($message) {
+        $this->_message = $message;
+    }
+
+    public function __get($property) {
+        if ($property == 'error') {
+            return true;
+        }
+        if ($property == 'message') {
+            return $this->_message;
+        }
+    }
+
+    public function __isset($property) {
+        return $property === 'error';
+    }
+
+    public function __toString() {
+        return $this->_message;
+    }
+}
+
 class ResponseQueued {
     public $queued = true;