1. 程式人生 > >ThinkPHP 5.0/5.1 自定義404介面的配置

ThinkPHP 5.0/5.1 自定義404介面的配置

★ 背景

  • 還要啥背景,就是覺得不可能用框架自帶的 404 介面唄.
  • 可能跟之前的版本配置方法有點區別,在此做一下簡單的筆記

框架:ThinkPHP 5.1ThinkPHP5.0.20

★ 配置過程

♩. 修改 config.app 檔案

  • 第一,需要關閉除錯模式
// 應用除錯模式
'app_debug'              => false,

一般在專案的開發過程中,可以設定為"true",但是專案上線部署後,一定要關閉除錯模式

  • 第二,增加或修改配置項: http_exception_template

如果是 ThinkPHP.5.0 框架,進行修改如下:

'http_exception_template'    =>  [
        // 定義404錯誤的重定向頁面地址
        404 =>  APP_PATH . 'index/view/exception_html/404.html',
        500 =>  APP_PATH . 'index/view/exception_html500.html',
    ],

如果是 ThinkPHP.5.1 框架,進行修改如下:

//TODO 自定義異常請求碼的頁面配置 建議只做非500錯誤頁面
    'http_exception_template'    =>
        [
            404 =>  Env::get('app_path') . 'index/view/exception_html/404.html',
            500 =>  Env::get('app_path') . 'index/view/exception_html/500.html',
        ],

上面的路徑配置,對應的檔案路徑是這樣的,同理可以擴充套件新增其他的請求碼配置頁:

♪. 靜態資源的引用

  • 這一點其實沒必要講,我只是給一個參考
  • 為了專案的介面設計統一性,至少頭部尾部都是一致的,以我為例,將自定義頁面的靜態檔案都放置在了 public/errors 目錄下

★ 演示效果

  • 在自己的專案連結中,隨意輸入不能訪問的連結,則會出現配置的 404 介面,其他同理顯示

★ 500不支援

①. 探討參考

  • 根據以上的操作,其實並不能匹配響應出 500 頁面
  • 追索原始碼發現跟 Handle 中的 render() 方法有關,進一步分析程式碼,應該是 **500 ** 情況不能例項化 HttpException 的原因
  • 原本試著修改瞭如下圖中的對應程式碼,但是 框架預設將出錯資料都認為了是 500 異常報錯
    ,這樣一來就不能 debug 正常除錯程式程式碼了

原始碼參考如下:

if ($e instanceof HttpException) {
            return $this->renderHttpException($e);
        } else {
            $response = $this->convertExceptionToResponse($e);
            $code = $response->getCode();
            if ($code == 500){
                $e = new HttpException(500,'The server is dead !',$e);
                return $this->renderHttpException($e);
            }else{
                return $this->convertExceptionToResponse($e);
            }
            //修改前
            //return $this->convertExceptionToResponse($e);
        }

極不建議修改框架核心原始碼,指不定又會整出來多少安全隱患,此處只是一個小提示而已!僅做了解即可…

②. 另一種解決方案

  • 修改 config.app 檔案中的配置項 exception_tmpl,線上和線下可分開配置
//TODO 異常頁面的模板檔案,主要作為500或程式報錯的處理頁面 
//此為生產模式下(線下)的配置操作,便於程式碼排錯
 'exception_tmpl'         => Env::get('think_path') . 'tpl/think_exception.tpl',
 //此為線上模式下的配置操作,便於隱藏內部錯誤資料,人性化顯示
 //'exception_tmpl'         => Env::get('think_path') . 'tpl/self_exception.html',

對於上述的配置項,主要是制定好顯示頁面即可,源框架中是 tpl 檔案,此處我直接複製了一個靜態頁面的原始碼而已,具體的動態顯示可以自己進行優化補充 …

③. 顯示效果

  • 如果是線上下的測試環境,app_debug 開啟,同時 exception_tmpl 為前者配置項,只要在控制器中隨便寫一點錯誤程式碼,就會出現500報錯,則效果如下:

  • 如果是在線上的外網環境,app_debug 關閉,同時 exception_tmpl 為後者配置項,如此一來, 報錯頁面如下:

★ 附錄

♩ 推薦學習

♪ 動態設定模板

  • 如果針對不同的客戶端情況可以動態設定模板,比如類似如下的程式碼形式
if (request()->isMobile()) {
config('template.view_path','application\\index\\view\\wap\\');
} else {
config('template.view_path','');
}

♫ 想了想

  • 想了想,參考的原始碼也沒啥必要上傳的,所以,自己動手哦 …
  • 重申,極不建議修改框架核心原始碼
  • 其實我很好奇,***ThinkPHP5.1 和 Laravel5.5 到底是什麼關係?***怎麼設計的那麼 像!像!像!