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