<?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; 
 | 
    } 
 | 
     
 | 
} 
 |