colly_wyx
2018-06-13 e4d5467f055ece8cc9dfdc02dd836bcc187034a5
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
<?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;
    }
    
}