ThinkPHP 3.2.3 的一個 Bug 和一個錯誤的設計

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) 所在的位置,決定了它正常狀況都不會被調用。
無論你將它改爲 xmljsonp、仍是 evalhtml

因而爲了使這個 Hook 生效,只能將 DEFAULT_AJAX_RETURN 這個配置改爲 jsonxmljsonpeval 以外的任意字符串。。。好比我將它改爲 'DEFAULT_AJAX_RETURN' => 'hook'ajax

而後在建立文件:/Application/Admin/Conf/tags.phpjson

<?php
return array(
    'ajax_return' => array('Admin\\Behaviors\\ajaxBehavior'),
);

再建立文件:/Application/Admin/Behaviors/ajaxBehavior.class.phpapp

<?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.ajaxerror 回調。jsonp

其實這也算另外一個 Bug 吧,Think\Controller::error 然道不該該響應一個錯誤的 HTTP 狀態碼?this

可是沒辦法,鑑於團隊的平均水平,用 ThinkPHP 開發仍然是最佳選擇。spa

等會去 Github 提交個 PR 看看會不會被採納。。。code

相關文章
相關標籤/搜索