利用钩子为 ThinkPHP 3.2.3 添加 AjaxReturn 的 Yaml 支持

Controller 的 ajaxReturn 方法:

http://document.thinkphp.cn/manual_3_2.html#ajax_return

读文档的时候,到最后出现了这么无奈的一句话:

除了上面四种返回类型外,我们还可以通过行为扩展来增加其他类型的支持,只需要对ajax_return标签位进行行为绑定即可。

如果我要 Yaml 呢?!!

我试试在配置里面加上这一条:

DEFAULT_AJAX_RETURN: yaml  # ajaxReturn 的编码方式

然后查看 ajaxReturn 定义的源代码,发现有这么一段:

protected function ajaxReturn($data,$type='',$json_option=0) {
    if(empty($type)) $type  =   C('DEFAULT_AJAX_RETURN');
    switch (strtoupper($type)){
        case 'JSON' :
            // ....
        case 'XML'  :
            // ....
        case 'JSONP':
            // ....
        case 'EVAL' :
            // ....
        default     :
            // 用于扩展其他返回格式数据
            Hook::listen('ajax_return',$data);
    }
}

很庆幸找到了一钩子!

既然有钩子,就可以挂衣服!

原来这个钩子在 ThinkPHP 里面叫做“标签位”

于是翻啊翻找到下面这一段文档:

http://document.thinkphp.cn/manual_3_2.html#behavior_extend

然后各种折腾,直接上结论,假设我们目前的 Module 是 Home:

1. 定义钩子行为的路径(官方称作标签行为定义):

创建 /Application/Common/Conf/tags.php

<?php
return array(
    'ajax_return' => array('Home\\Behaviors\\AjaxReturnBehavior'),
);

然后返回一个字典,键是钩子(标签)名称,这里是 ajax_return;

然后指向一个行为的类(我们等下实现这个);

2. 在我们的 Module 下面新建一个 Behaviors 文件夹,然后创建一个跟上一步对应的 AjaxReturnBehavior.class.php
<?php
namespace Home\Behaviors;

class AjaxReturnBehavior extends \Think\Behavior {
    public function run(&$param) {
        if(empty($type)) $type  =   C('DEFAULT_AJAX_RETURN');
        switch (strtoupper($type)){
            case 'YAML':
                // 返回YAML数据格式到客户端 包含状态信息
                header('Content-Type:text/yaml; charset=utf-8');
                // Alternative, see: http://stackoverflow.com/questions/332129/yaml-mime-type
                // header('Content-Type:application/x-yaml; charset=utf-8');
                exit(\Spyc::YAMLDump($param));
        }
    }
}

如是这般,即便生效,测试一下:

<?php
namespace Home\Controller;
use Think\Controller;
class IndexController extends Controller {
    public function index() {
        $this->ajaxReturn(array(
            1, 2, 3, 4,
        ));
    }
}

通过这个例子大致了解的 ThinkPHP 的钩子机制,后面有同类的事情就可以应用。


【转载请附】愿以此功德,回向 >>

原文链接:https://www.huangwenchao.com.cn/2015/03/thinkphp-ajax-yaml.html【利用钩子为 ThinkPHP 3.2.3 添加 AjaxReturn 的 Yaml 支持】

发表评论

电子邮件地址不会被公开。 必填项已用*标注