tp5 API 自定義全局異常處理(上)

我們接著重構(gòu) tp5 參數(shù)校驗層的項目進行下面的代碼:
在全局異常處理之前,我們先來實現(xiàn)一下 Banner 控制器的功能:
我們在 controller 的同級目錄下新建一個 model 文件夾。在其下面新建一個 Banner 類。
(這里為了簡潔,我們的控制器類和業(yè)務類都叫做 Banner,我們通過所屬在不同的文件夾下進行區(qū)分即可)

<?php

namespace app\api\model;

class Banner{
  public static function getBannerById($id){
    //TODO: 根據(jù) Banner ID 號,獲取 Banner 信息
    return 'banner info';
  }
}

接著我們進行編輯控制器的類。由于控制器和業(yè)務類重名,所以需要在引入的時候注意:

<?php

namespace app\api\controller\v1;

use app\api\validate\IDMustBePositiveInt;
use app\api\model\Banner as BannerModel;

class Banner{
  public function getBanner($id){
    (new IDMustBePositiveInt())->goCheck();
    
    $banner = BannerModel::getBannerByID($id);
    return $banner;
  }
}

現(xiàn)在我們來假設這一種情況,客戶端傳來了 id 為 50,由于 50 是正整數(shù),所以通過了參數(shù)校驗,但我們的數(shù)據(jù)庫中沒有 id 號為 50 的 banner,這時候我們就需要進行相應的異常處理。
為了進行演示我們在 model\Banner 中加入以下錯誤的代碼:

try{
  1/0;
}
catch(Exception $e){
  throw $e;
}

現(xiàn)在我們在業(yè)務類中拋出了異常,假如我們控制器中不做處理,那么就會拋給全局異常處理器處理,并返回以下 html 頁面:

錯誤信息的 html 截圖

這個頁面適合后端調(diào)試,但是不適合給客戶端來看,尤其是作為接口的返回來說。
有的人可能會說,返回 html 是因為開啟了 tp5 調(diào)試模式,那么我們將 config.php 中的 'app_debug' 的值改為 false,又會返回一個這樣的頁面:
這個頁面當然也不適合API返回給客戶端

那么我們在設計接口的時候該如何向客戶端返回錯誤信息呢?
基于 RESTFul 規(guī)范,我們需要定義一個統(tǒng)一的錯誤返回消息。
我們改寫一下控制器中的代碼:

class Banner{
  public function getBanner($id){
    (new IDMustBePositiveInt())->goCheck();

    try{
      $banner = BannerModel::getBannerByID($id);
    } 
    catch(Exception $e)
    {
      $err = [
        'error_code' => 10001,
        'msg' => $e->getMessage()
      ];
      return json($err,400); // 注意不能直接返回數(shù)組,而應該用json包一下
    }

    return $banner;

  }
}

我們再在 Postman 里看一下返回結(jié)果:


客戶端可以處理的返回結(jié)果

400狀態(tài)碼

這樣我們這種直白的方法就寫出來了,但我們反思一下,如果每一個控制器我們都要這樣繁瑣地處理異常,那么我們今后編寫代碼的思路一定難以保證十分流暢,而是會在這些異常的處理上耗費大量精力。而且這個僅僅是一個示例,實際上我們很多情況下是不可預知是否會有異常的,可能還會返回 tp5 自己的錯誤的網(wǎng)頁,對于我們 API 來說是不合適的。

現(xiàn)在我們花了大量的篇幅展示了一種錯誤的、復用性差的直白寫法,比起直接展示最終的結(jié)果,演示這些錯誤的寫法我認為也是很有必要的,因為這是我們一步一步思路的體現(xiàn)。重構(gòu)代碼不是一蹴而就的,期間代碼的寫法也會越來越抽象,所以我們需要靜下心來,不斷地完善。

tp5 API 自定義全局異常處理(中)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

  • 理工寢室商店-微信小程序 疑問小結(jié) 當時在XAMMP下mysql目錄下的bin下 php -v 不起作用.到ph...
    這個超人不會飛阿閱讀 1,827評論 1 1
  • 前言: 說到異??刂?,也許很多會比較陌生,我身邊很少人會去寫拋異常的代碼。但是異常用好了是非常的方便大家開發(fā)。首先...
    祥哥去哪里閱讀 5,726評論 2 7
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,308評論 25 708
  • 說實話,剛報名完參與寫作班,我就后悔了!倒不是覺得自己的文字有多難看,而是怕自己根本不能堅持。 回家前一天,兄弟發(fā)...
    人里面哪有你閱讀 466評論 0 2
  • 民族團結(jié) 維吾爾族老阿爸 趕著馬車去工地 我在建設和田 你不認識我 沒關(guān)系 我們都是一家人 共同的名子叫中國 你快...
    李家長安閱讀 232評論 0 2

友情鏈接更多精彩內(nèi)容