From 8f7207361edb10527ca6468010e258f469b003cf Mon Sep 17 00:00:00 2001 From: ctrlaltca <> Date: Thu, 30 Aug 2012 21:43:14 +0000 Subject: Documentation for the T*Rpc* classes --- framework/Web/Services/TRpcService.php | 137 ++++++++++++++++++++++++++++++--- 1 file changed, 125 insertions(+), 12 deletions(-) (limited to 'framework') diff --git a/framework/Web/Services/TRpcService.php b/framework/Web/Services/TRpcService.php index 8c8a6835..a2691af4 100644 --- a/framework/Web/Services/TRpcService.php +++ b/framework/Web/Services/TRpcService.php @@ -13,10 +13,41 @@ /** * TRpcService class * - * Usage: - * - * + * The TRpcService class is a generic class that can be extended and used to implement + * rpc services using different servers and protocols. + * + * A server is a {@link TModule} that must subclass {@link TRpcServer}: its role is + * to be an intermediate, moving data between the service and the provider. The base + * {@link TRpcServer} class should suit the most common needs, but can be sublassed for + * logging and debugging purposes, or to filter and modify the request/response on the fly. + * + * A protocol is a {@link TModule} that must subclass {@link TRpcProtocol}: its role is + * to implement the protocol that exposes the rpc api. Prado already implements two + * protocols: {@link TXmlRpcProtocol} for Xml-Rpc request and {@link TJsonRpcProtocol} for + * JSON-Rpc requests. + * + * A provider is a {@link TModule} that must subclass {@link TRpcApiProvider}: its role is + * to implement the methods that are available through the api. Each defined api must be + * a sublass of the abstract class {@link TRpcApiProvider} and implement its methods. + * + * The flow of requests and reponses is the following: + * Request <-> TRpcService <-> TRpcServer <-> TRpcProtocol <-> TRpcApiProvider <-> Response + * + * To define an rpc service, add the proper application configuration: + * + * + * + * + * + * + * * + * + * + * An api can be registered adding a proper definition inside the service + * configuration. Each api definition must contain an id property and a class name + * expressed in namespace format. When the service receives a request for that api, + * the specified class will be instanciated in order to satisfy the request. * * @author Robin J. Rogge * @version $Id$ @@ -96,6 +127,7 @@ class TRpcService extends TService } /** + * Loads the service configuration * @param TXmlElement $xml configuration */ public function loadConfig(TXmlElement $xml) @@ -148,6 +180,14 @@ class TRpcService extends TService /** * TRpcServer class * + * TRpcServer is a class + * + * TRpcServer is the base class used to creare a server to be used in conjunction with + * {@link TRpcService}. + * The role of TRpcServer is to be an intermediate, moving data between the service and + * the provider. This base class should suit the most common needs, but can be sublassed for + * logging and debugging purposes, or to filter and modify the request/response on the fly. + * * @author Robin J. Rogge * @version $Id$ * @package System.Web.Services @@ -170,6 +210,7 @@ class TRpcServer extends TModule } /** + * Registers the method in the protocol handler * @param string $methodName * @param array $methodDetails */ @@ -179,6 +220,7 @@ class TRpcServer extends TModule } /** + * Retrieves the request payload * @return string request payload */ public function getPayload() @@ -187,6 +229,7 @@ class TRpcServer extends TModule } /** + * Passes the request payload to the protocol handler and returns the result * @return string rpc response */ public function processRequest() @@ -226,6 +269,32 @@ class TRpcException extends TException /** * TRpcApiProvider class * + * TRpcApiProvider is an abstract class the can be subclasses in order to implement an + * api for a {@link TRpcService}. A subclass of TRpcApiProvider must implement the + * {@link registerMethods} method in order to declare the available methods, their + * names and the associated callback. + * + * + * public function registerMethods() + * { + * return array( + * 'apiMethodName1' => array('method' => array($this, 'objectMethodName1')), + * 'apiMethodName2' => array('method' => array('ClassName', 'staticMethodName')), + * ); + * } + * + * + * In this example, two api method have been defined. The first refers to an object + * method that must be implemented in the same class, the second to a static method + * implemented in a 'ClassName' class. + * In both cases, the method implementation will receive the request parameters as its + * method parameters. Since the number of received parameters depends on + * external-supplied data, it's adviced to use php's func_get_args() funtion to + * validate them. + * + * Providers must be registered in the service configuration in order to be available, + * as explained in {@link TRpcService}'s documentation. + * * @author Robin J. Rogge * @version $Id$ * @package System.Web.Services @@ -238,12 +307,15 @@ abstract class TRpcApiProvider extends TModule */ protected $rpcServer; - // abstracts - + /** + * Must return an array of the available methods + * @abstract + */ abstract public function registerMethods(); - // methods - + /** + * Constructor: informs the rpc server of the registered methods + */ public function __construct(TRpcServer $rpcServer) { $this->rpcServer = $rpcServer; @@ -252,13 +324,18 @@ abstract class TRpcApiProvider extends TModule $this->rpcServer->addRpcMethod($_methodName, $_methodDetails); } + /** + * Processes the request using the server + * @return processed request + */ public function processRequest() { return $this->rpcServer->processRequest(); } - // getter/setter - + /** + * @return rpc server instance + */ public function getRpcServer() { return $this->rpcServer; @@ -268,6 +345,10 @@ abstract class TRpcApiProvider extends TModule /** * 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 * @version $Id$ * @package System.Web.Services @@ -276,16 +357,45 @@ abstract class TRpcApiProvider extends TModule abstract class TRpcProtocol { /** - * @var array containis the mapping from RPC method names to the actual handlers + * @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 @@ -323,7 +433,9 @@ abstract class TRpcProtocol /** * TJsonRpcProtocol class * - * Implements the JSON RPC protocol + * TJsonRpcProtocol is a class that implements JSON-Rpc protocol in {@link TRpcService}. + * Both version 1.0 and 2.0 of the specification are implemented, and the server will try + * to answer using the same version of the protocol used by the requesting client. * * @author Robin J. Rogge * @author Fabio Bas @@ -492,7 +604,8 @@ class TJsonRpcProtocol extends TRpcProtocol /** * TXmlRpcProtocol class * - * Implements the XML RPC protocol + * TXmlRpcProtocol is a class that implements XML-Rpc protocol in {@link TRpcService}. + * It's basically a wrapper to the xmlrpc_server_* family of php methods. * * @author Robin J. Rogge * @version $Id$ -- cgit v1.2.3