colly_wyx
2018-04-23 0c4b798032fd08f562570201c0ae6ba1d040cfba
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
<?php
/**
 * 框架版本号
 */
defined('PHALAPI_VERSION') || define('PHALAPI_VERSION', '1.4.1');
 
/**
 * 项目根目录
 */
defined('PHALAPI_ROOT') || define('PHALAPI_ROOT', dirname(__FILE__));
 
require_once PHALAPI_ROOT . DIRECTORY_SEPARATOR . 'PhalApi' . DIRECTORY_SEPARATOR . 'Loader.php';
 
/**
 * PhalApi 应用类
 *
 * - 实现远程服务的响应、调用等操作
 * 
 * <br>使用示例:<br>
```
 * $api = new PhalApi();
 * $rs = $api->response();
 * $rs->output();
```
 *
 * @package     PhalApi\Response
 * @license     http://www.phalapi.net/license GPL 协议
 * @link        http://www.phalapi.net/
 * @author      dogstar <chanzonghuang@gmail.com> 2014-12-17
 */
 
class PhalApi {
    
    /**
     * 响应操作
     *
     * 通过工厂方法创建合适的控制器,然后调用指定的方法,最后返回格式化的数据。
     *
     * @return mixed 根据配置的或者手动设置的返回格式,将结果返回
     *  其结果包含以下元素:
```
     *  array(
     *      'ret'   => 200,                //服务器响应状态
     *      'data'  => array(),            //正常并成功响应后,返回给客户端的数据    
     *      'msg'   => '',                //错误提示信息
     *  );
```
     */
    public function response() {
        $rs = DI()->response;
        try {
            // 接口调度与响应
            $api    = PhalApi_ApiFactory::generateService(); 
            $action = DI()->request->getServiceAction();
            $data   = call_user_func(array($api, $action));
 
            $rs->setData($data);
        } catch (PhalApi_Exception $ex) {
            // 框架或项目可控的异常
            $rs->setRet($ex->getCode());
            $rs->setMsg($ex->getMessage());
        } catch (Exception $ex) {
            // 不可控的异常
            DI()->logger->error(DI()->request->getService(), strval($ex));
 
            if (DI()->debug) {
                $rs->setRet($ex->getCode());
                $rs->setMsg($ex->getMessage());
                $rs->setDebug('exception', $ex->getTrace());
            } else {
                throw $ex;
            }
        }
 
        $rs->setDebug('stack', DI()->tracer->getStack());
        $rs->setDebug('sqls', DI()->tracer->getSqls());
 
        return $rs;
    }
    
}