| <?php | 
| /** | 
|  * PhalApi_ApiFactory 创建控制器类 工厂方法 | 
|  * | 
|  * 将创建与使用分离,简化客户调用,负责控制器复杂的创建过程 | 
|  * | 
| ``` | 
|  *      //根据请求(?service=XXX.XXX)生成对应的接口服务,并进行初始化 | 
|  *      $api = PhalApi_ApiFactory::generateService(); | 
| ``` | 
|  * @package     PhalApi\Api | 
|  * @license     http://www.phalapi.net/license GPL 协议 GPL 协议 | 
|  * @link        http://www.phalapi.net/ | 
|  * @author      dogstar <chanzonghuang@gmail.com> 2014-10-02 | 
|  */ | 
|   | 
| class PhalApi_ApiFactory { | 
|   | 
|     /** | 
|      * 创建服务器 | 
|      * 根据客户端提供的接口服务名称和需要调用的方法进行创建工作,如果创建失败,则抛出相应的自定义异常 | 
|      * | 
|      * 创建过程主要如下: | 
|      * - 1、 是否缺少控制器名称和需要调用的方法 | 
|      * - 2、 控制器文件是否存在,并且控制器是否存在 | 
|      * - 3、 方法是否可调用 | 
|      * - 4、 控制器是否初始化成功 | 
|      * | 
|      * @param boolen $isInitialize 是否在创建后进行初始化 | 
|      * @param string $_REQUEST['service'] 接口服务名称,格式:XXX.XXX | 
|      * @return PhalApi_Api 自定义的控制器 | 
|      * | 
|      * @uses PhalApi_Api::init() | 
|      * @throws PhalApi_Exception_BadRequest 非法请求下返回400 | 
|      */ | 
|     static function generateService($isInitialize = TRUE) { | 
|         $service    = DI()->request->getService(); | 
|         $api        = DI()->request->getServiceApi(); | 
|         $action     = DI()->request->getServiceAction(); | 
|   | 
|         if (empty($api) || empty($action)) { | 
|             throw new PhalApi_Exception_BadRequest( | 
|                 T('service ({service}) illegal', array('service' => $service)) | 
|             ); | 
|         } | 
|   | 
|         $apiClass = 'Api_' . ucfirst($api); | 
|         if (!class_exists($apiClass)) { | 
|             throw new PhalApi_Exception_BadRequest( | 
|                 T('no such service as {service}', array('service' => $service)), 4 | 
|             ); | 
|         } | 
|   | 
|         $api = new $apiClass(); | 
|   | 
|         if (!is_subclass_of($api, 'PhalApi_Api')) { | 
|             throw new PhalApi_Exception_InternalServerError( | 
|                 T('{class} should be subclass of PhalApi_Api', array('class' => $apiClass)) | 
|             ); | 
|         } | 
|   | 
|         if (!method_exists($api, $action) || !is_callable(array($api, $action))) { | 
|             throw new PhalApi_Exception_BadRequest( | 
|                 T('no such service as {service}', array('service' => $service)), 4 | 
|             ); | 
|         } | 
|   | 
|         if ($isInitialize) { | 
|             $api->init(); | 
|         } | 
|   | 
|         return $api; | 
|     } | 
|      | 
| } |