您好,登錄后才能下訂單哦!
本篇內容主要講解“thinkphp5中是怎么自定義全局異常”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“thinkphp5中是怎么自定義全局異常”吧!
為了針對書寫 api 時,對各種錯誤返回不通的 json ,直接使用 TP5 自帶的提示錯誤頁面,對于客戶端而言,明顯沒有任何的作用,所以需要自己來自定義全局異常。
1.創建一個全局異常的類(用于傳錯誤信息,狀態碼等)
use think\Exception; class BaseException extends Exception { /** HTTP 狀態碼 * @var string */ public $code; /** 自定義錯誤碼 * @var string */ public $errorCode; /** 錯誤信息 * @var string */ public $msg; public function __construct($params=[]) { if (! $params) { return ; } // 如果傳了 code if ($array_key_exists('code', $code) { $this->code = $code; } // 如果傳了 errorCode if (array_key_exists('errorCode', $params)) { $this->errorCode = $params['errorCode']; } // 如果傳了 msg if (array_key_exists('msg', $params)) { $this->msg = $params['msg']; } } }
這樣就可以給以傳不通的狀態碼,錯誤信息和自定義錯誤碼。
2. 創建一個錯誤處理類
錯誤處理類,繼承于TP5自帶的錯誤處理類,重寫該 render 方法,就可以自定義錯誤。
use Exception; use think\exception\Handle; use think\Request; class ExceptionHandle extends Handle { /** 狀態碼 * @var */ private $code; /** 自定義錯誤碼 * @var */ private $errorCode; /** 錯誤信息 * @var */ private $msg; /** 重寫 Handle 方法里的Render * @param Exception $e * @return \think\response\Json */ // 注意這里是基類 Exception public function render(Exception $e) { if ($e instanceof BaseException) { //如果是自定義異常,則控制http狀態碼,不需要記錄日志 //因為這些通常是因為客戶端傳遞參數錯誤或者是用戶請求造成的異常 //不應當記錄日志 $this->msg = $e->msg; $this->code = $e->code; $this->errorCode = $e->errorCode; } else { // 如果是服務器未處理的異常,將http狀態碼設置為500,并記錄日志 if (config('app_debug')) { // 調試狀態下需要顯示TP默認的異常頁面,因為TP的默認頁面 // 很容易看出問題 return parent::render($e); } $this->code = 500; $this->msg = '服務器內部錯誤,不想告訴你'; $this->errorCode = 999; $this->recordErrorLog($e); } $request = Request::instance(); $result = [ 'msg' => $this->msg, 'errorCode' => $this->errorCode, 'request_url' => $request->url() ]; return json($result, $this->code); } /** 錯誤日志處理 * 這里把config里日志配置的type改為test * @param Exception $e */ private function recordErrorLog(Exception $e) { // 開啟日志 Log::init([ 'type' => 'File', 'path' => LOG_PATH, 'level' => ['error'] ]); // 日志記錄方法 Log::record($e->getMessage(),'error'); } }
3.修改配置config
// 異常處理handle類 留空使用 \think\exception\Handle 'exception_handle' => 'app\lib\exception\ExceptionHandle', // 關閉日志 'log' => [ // 日志記錄方式,內置 file socket 支持擴展 // 關閉自動記錄日志,請將type設置為test 'type' => 'test', // 日志保存目錄 'path' => __DIR__.'/../log/', // 日志記錄級別 'level' => ['sql'], ],
4.使用錯誤類的方法
// 這里隨便創建一個userControlelr class UserController extends Controller { use app\api\model\User; /** * 根據 id 獲取某個用戶 */ public function getUser($id) { $user = User::get($id); // 如果 $user 為空 拋出自定義的錯誤,下面有... if(! $user) { throw UserMissException(); } return json($user); } }
自定義的錯誤子類
// 上面第一節,寫的 Base 錯誤類派上用場了。 class UserMissException extends BaseException { /** HTTP 狀態碼 * @var string */ public $code = '404'; /** 自定義錯誤碼 * @var string */ public $errorCode = '40000'; /** 錯誤信息 * @var string */ public $msg = '請求的用戶不存在'; }
請求這個 getUser 方法,報錯~ 就會顯示
{ "msg": "請求的用戶不存在", "errorCode": "40000", "request_url": "/api/v1/user/10" }
其他的錯誤類型,也就可以繼續創建異常子類,定義這些錯誤屬性。
到此,相信大家對“thinkphp5中是怎么自定義全局異常”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。