扩展处理类型


CP的视图控制器除了HTML外, 还支持JSON和XML, 除此之外还可以自定义处理类型.

指定处理类型

app配置文件sys中的display, 用于指定当前的视图处理类型

/**
 * 系统设置
 */
'sys' => array(

    /**
     * Http会话认证方式
     * 默认支持 COOKIE 和 SESSION, 也可以指定为自定义的类
     * 如: '\lib\MysqlSession' 或 new \lib\MysqlSession()
     */
    'auth' => 'COOKIE',
    /**
     * 默认的template路径
     */
    'default_tpl_dir' => 'default',
    /**
     * 指定View输出的方法,默认是HTML.
     * 如果值为JSON或XML的时候,会直接调用View中的JSON或XML方法来输出数据
     * 也可以在View中自定义处理方法(比如RSS等)
     */
    'display' => 'HTML'
),

默认值是HTML, 这是一个标识, 代表需要处理HTML页面, 需要加载layer

XML / JSON

当指定类型为XMLJSON时, 会自动调用Cross\MVC\View中的XML()JSON()方法来处理数据, 并发送合适的HTTP头

/**
 * 输出JSON
 *
 * @param $data
 */
function JSON($data)
{
    Response::getInstance()->setContentType('json');
    echo json_encode($data);
}

/**
 * 输出XML
 *
 * @param $data
 * @param string $root_name
 */
function XML($data, $root_name = 'root')
{
    Response::getInstance()->setContentType('xml');
    $xml = Array2XML::createXML($root_name, $data);
    echo $xml->saveXML();
}

当需要自定义JSONXML处理方法时, 在项目的视图控制器基类中覆盖这两个方法即可.

自定义处理类型

除了默认的XML,JSON外, 我们还可以为display自定义一个值, 并在视图控制器中添加相应的方法来处理数据, 比如我们要为api指定处理数据的类型是MSGPACK, 先修改display的值

/**
 * 系统设置
 */
'sys' => array(

    /**
     * Http会话认证方式
     * 默认支持 COOKIE 和 SESSION, 也可以指定为自定义的类
     * 如: '\lib\MysqlSession' 或 new \lib\MysqlSession()
     */
    'auth' => 'COOKIE',
    /**
     * 默认的template路径
     */
    'default_tpl_dir' => 'default',
    /**
     * 指定View输出的方法,默认是HTML.
     * 如果值为JSON或XML的时候,会直接调用View中的JSON或XML方法来输出数据
     * 也可以在View中自定义处理方法(比如RSS等)
     */
    'display' => 'MSGPACH'
),

然后在ApiView中新增一个方法

namespace app\api\views;

use Cross\MVC\View;

/**
 * @Auth: wonli <wonli@live.com>
 * Class ApiView
 * @package app\api\views
 */
class ApiView extends View
{
    function MSGPACK($data)
    {
        echo msgpack_pack($data);
    }
}

到此就完成对MSG_PACK的支持了, 通过灵活的扩展, 我们可以支持未来的任何格式, 关于MSG PACK, 详见他们官网 http://msgpack.org/