yii2 開(kāi)發(fā)api接口時(shí)優(yōu)雅的處理全局異常的方法
前言:個(gè)人覺(jué)得,學(xué)習(xí)或溫習(xí)一套Web
框架,在快速閱讀一遍文檔后,應(yīng)從路由,控制器,請(qǐng)求/響應(yīng)對(duì)象,數(shù)據(jù)模型(Logic,Dao,Entity),全局異常處理
幾個(gè)方面下手,這幾項(xiàng)了解后,框架上手就游刃有余了。然后我比較喜歡在開(kāi)工前整理好框架的全局異常處理,方便寫(xiě) api
時(shí)錯(cuò)誤的統(tǒng)一響應(yīng)。
在api
接口的開(kāi)發(fā)過(guò)程中,我們需要對(duì)用戶數(shù)據(jù)進(jìn)行嚴(yán)格的校驗(yàn),防止非法輸入對(duì)服務(wù)產(chǎn)生安全問(wèn)題,在開(kāi)發(fā)過(guò)程中,我比較喜歡即時(shí)的以拋出異常
的方式中斷請(qǐng)求的處理,并以全局異常處理器
格式化處理后統(tǒng)一返回給客戶端。
今天就把 yii2
自帶的全局異常處理器改寫(xiě)至對(duì) api
友好(yii2
的 yii\web\HttpException
默認(rèn)對(duì) web 請(qǐng)求友好,都是以text/html
的方式返回錯(cuò)誤描述,對(duì)api
不友好,api
當(dāng)然是json
)。
注冊(cè)異常處理器
yii2
也是以 controller/action
的方式定義一個(gè)異常處理器的,我們可以在 components=>errorHandler
中自定義。
# config/web.php 'components' => [ 'errorHandler' => [ 'errorAction' => 'exception/handler' ] ]
異常處理器
定義相應(yīng)的異常處理器,app\actions\ErrorApiAction
繼承 yii\web\ErrorAction
,可以拿到yii2
為我們整理好的全局異常。
# controllers/ExceptionController.php <?php namespace app\controllers; use yii\web\Controller; class ExceptionController extends Controller { /** * 為 actionHandler 掛載獨(dú)立的 action * @return array */ public function actions() { return [ 'handler' => [ 'class' => 'app\actions\ErrorApiAction', ] ]; } }
對(duì)api
友好的錯(cuò)誤異常處理器,這里我也只是簡(jiǎn)單的把響應(yīng)格式改了一下,異常的上下文還是用yii2
自帶的處理的。
#actions/ErrorApiAction.php <?php /** * @author wangzhijian@styd.com * @date 2019-5-13 17:20:10 * Api 全局錯(cuò)誤異常處理器 */ namespace app\actions; use Yii; use yii\web\ErrorAction; use yii\web\Response; class ErrorApiAction extends ErrorAction { public function run() { // 根據(jù)異常類(lèi)型設(shè)定相應(yīng)的響應(yīng)碼 Yii::$app->getResponse()->setStatusCodeByException($this->exception); // json 格式返回 Yii::$app->getResponse()->format = Response::FORMAT_JSON; // 返回的內(nèi)容數(shù)據(jù) return [ 'msg' => $this->exception->getMessage(), 'err' => $this->exception->getCode() ]; } }
異常實(shí)體
主要是簡(jiǎn)單的把狀態(tài)碼的傳遞封裝一下,用更容易理解的類(lèi)名來(lái)代理傳遞。
exceptions/HttpException.php
<?php /** * app 異常基礎(chǔ)類(lèi) */ namespace app\exceptions; class HttpException extends \yii\web\HttpException { public function __construct($message = null, $code = 0, \Exception $previous = null) { parent::__construct($this->statusCode, $message, $code, $previous); } }
exceptions/HttpForbiddenException.php
<?php /** * 400 bad request */ namespace app\exceptions; class HttpBadRequestException extends HttpException { public $statusCode = 400; }
exceptions/HttpUnauthorizedException.php
<?php /** * 401 unauthorized */ namespace app\exceptions; class HttpUnauthorizedException extends HttpException { public $statusCode = 401; }
exceptions/HttpForbiddenException.php
<?php /** * 403 forbidden */ namespace app\exceptions; class HttpForbiddenException extends HttpException { public $statusCode = 403; }
exceptions/HttpNotFoundException.php
<?php /** * 404 not found */ namespace app\exceptions; class HttpNotFoundException extends HttpException { public $statusCode = 404; }
使用范例
在一些 service logic model
中根據(jù)需要即時(shí)拋出異常即可,上層控制器拿到的永遠(yuǎn)都是正常的返回?cái)?shù)據(jù),絕對(duì)的2xx
響應(yīng)簇
throw new HttpBadRequestException("具體的非法描述", 4001); throw new HttpUnauthorizedException("請(qǐng)認(rèn)證后訪問(wèn)"); throw new HttpForbiddenException("無(wú)權(quán)訪問(wèn)"); throw new HttpNotFoundException("請(qǐng)求資源不存在");
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
創(chuàng)建數(shù)據(jù)庫(kù)php代碼 用PHP寫(xiě)出自己的BLOG系統(tǒng)
今天的任務(wù)是創(chuàng)建數(shù)據(jù)庫(kù),因?yàn)閷?duì)數(shù)據(jù)庫(kù)懂的很少,所以在數(shù)據(jù)庫(kù)表關(guān)系上還很差啊。2010-04-04php利用云片網(wǎng)實(shí)現(xiàn)短信驗(yàn)證碼功能的示例代碼
這篇文章主要介紹了php利用云片網(wǎng)實(shí)現(xiàn)短信驗(yàn)證碼功能的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-11-11php讀取qqwry.dat ip地址定位文件的類(lèi)實(shí)例代碼
下面小編就為大家?guī)?lái)一篇php讀取qqwry.dat ip地址定位文件的類(lèi)實(shí)例代碼。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-11-11PHP實(shí)現(xiàn)頁(yè)面靜態(tài)化深入講解
這篇文章主要介紹了PHP實(shí)現(xiàn)頁(yè)面靜態(tài)化深入講解,本文講解的很透徹,有感興趣的同學(xué)可以研究下2021-03-03PHP判斷表達(dá)式中括號(hào)是否匹配的簡(jiǎn)單實(shí)例
下面小編就為大家?guī)?lái)一篇PHP判斷表達(dá)式中括號(hào)是否匹配的簡(jiǎn)單實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-10-10