ThinkPHP 3.2.3 的 ajax_rerurn
这个 Hook
是有逻辑错误的……
源代码在这里:php
protected function ajaxReturn($data,$type='',$json_option=0) { if(empty($type)) $type = C('DEFAULT_AJAX_RETURN'); switch (strtoupper($type)){ case 'JSON' : // 返回JSON数据格式到客户端 包含状态信息 header('Content-Type:application/json; charset=utf-8'); exit(json_encode($data,$json_option)); case 'XML' : // 返回xml格式数据 header('Content-Type:text/xml; charset=utf-8'); exit(xml_encode($data)); case 'JSONP': // 返回JSON数据格式到客户端 包含状态信息 header('Content-Type:application/json; charset=utf-8'); $handler = isset($_GET[C('VAR_JSONP_HANDLER')]) ? $_GET[C('VAR_JSONP_HANDLER')] : C('DEFAULT_JSONP_HANDLER'); exit($handler.'('.json_encode($data,$json_option).');'); case 'EVAL' : // 返回可执行的js脚本 header('Content-Type:text/html; charset=utf-8'); exit($data); default : // 用于扩展其余返回格式数据 Hook::listen('ajax_return',$data); } }
其中 C('DEFAULT_AJAX_RETURN')
获取到的配置默认是 json
。
很明显 Hook::listen('ajax_return',$data)
所在的位置,决定了它正常状况都不会被调用。
无论你将它改为 xml
、jsonp
、仍是 eval
。html
因而为了使这个 Hook
生效,只能将 DEFAULT_AJAX_RETURN
这个配置改为 json
、xml
、jsonp
、eval
以外的任意字符串。。。好比我将它改为 'DEFAULT_AJAX_RETURN' => 'hook'
。ajax
而后在建立文件:/Application/Admin/Conf/tags.php
json
<?php return array( 'ajax_return' => array('Admin\\Behaviors\\ajaxBehavior'), );
再建立文件:/Application/Admin/Behaviors/ajaxBehavior.class.php
app
<?php namespace Admin\Behaviors; use Think\Behavior; class ajaxBehavior extends Behavior { function run(&$data) { if ($data['status']===0) { http_response_code(500); } header('Content-Type:application/json; charset=utf-8'); exit(json_encode($data, JSON_UNESCAPED_UNICODE)); } }
个人目的是:Controller
内调用 $this->error('tmdphp')
的时候,响应的 HTTP 状态码变成 500。
这样客户端才会正确的执行 jQuery.ajax
的 error
回调。jsonp
其实这也算另外一个 Bug 吧,Think\Controller::error
然道不该该响应一个错误的 HTTP 状态码?this
可是没办法,鉴于团队的平均水平,用 ThinkPHP
开发仍然是最佳选择。spa
等会去 Github 提交个 PR 看看会不会被采纳。。。code