blob: 397bd9724db4b709ebd4eed5252a6c5774ce09bc (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
|
<?php
/**
* @author Robin J. Rogge <rrogge@bigpoint.net>
* @link http://www.pradosoft.com/
* @copyright 2010 Bigpoint GmbH
* @license http://www.pradosoft.com/license/
* @version $Id$
* @since 3.2
* @package Prado\Web\Services
*/
namespace Prado\Web\Services;
/**
* TRpcProtocol class
*
* TRpcProtocol is the base class used to implement a protocol in a {@link TRpcService}.
* Prado already implements two protocols: {@link TXmlRpcProtocol} for Xml-Rpc request
* and {@link TJsonRpcProtocol} for JSON-Rpc requests.
*
* @author Robin J. Rogge <rrogge@bigpoint.net>
* @version $Id$
* @package Prado\Web\Services
* @since 3.2
**/
abstract class TRpcProtocol
{
/**
* @var array containing the mapping from RPC method names to the actual handlers
*/
protected $rpcMethods = array();
// abstracts
/**
* @param string request payload
* Processed the request ans returns the response, if any
* @return processed response
* @abstract
*/
abstract public function callMethod($requestPayload);
/**
* @param TRpcException the exception with error details
* Creates a proper response for an error condition
* @return a response representing the error
* @abstract
*/
abstract public function createErrorResponse(TRpcException $exception);
/**
* @param response
* Sets the needed headers for the response (eg: content-type, charset)
* @abstract
*/
abstract public function createResponseHeaders($response);
/**
* Encodes the response
* @param mixed reponse data
* @return string encoded response
* @abstract
*/
abstract public function encode($data);
/**
* Decodes the request payload
* @param string request payload
* @return mixed decoded request
* @abstract
*/
abstract public function decode($data);
// methods
/**
* Registers a new RPC method and handler details
* @param string $methodName
* @param array $handlerDetails containing the callback handler
*/
public function addMethod($methodName, $handlerDetails)
{
$this->rpcMethods[$methodName] = $handlerDetails;
}
/**
* Calls the callback handler for the given method
* @param string $methodName of the RPC
* @param array $parameters for the callback handler as provided by the client
* @return mixed whatever the callback handler returns
*/
public function callApiMethod($methodName, $parameters)
{
if(!isset($this->rpcMethods[$methodName]))
throw new TRpcException('Method "'.$methodName.'" not found');
if($parameters === null)
$parameters = array();
if(!is_array($parameters))
$parameters = array($parameters);
return call_user_func_array($this->rpcMethods[$methodName]['method'], $parameters);
}
}
|