前言:個人覺得,學習或溫習一套Web
框架,在快速閱讀一遍文檔后,應從路由,控制器,請求/響應對象,數(shù)據(jù)模型(Logic,Dao,Entity),全局異常處理
幾個方面下手,這幾項了解后,框架上手就游刃有余了。然后我比較喜歡在開工前整理好框架的全局異常處理,方便寫 api
時錯誤的統(tǒng)一響應。
在api
接口的開發(fā)過程中,我們需要對用戶數(shù)據(jù)進行嚴格的校驗,防止非法輸入對服務產(chǎn)生安全問題,在開發(fā)過程中,我比較喜歡即時的以拋出異常
的方式中斷請求的處理,并以全局異常處理器
格式化處理后統(tǒng)一返回給客戶端。
今天就把 yii2
自帶的全局異常處理器改寫至對 api
友好(yii2
的 yii\web\HttpException
默認對 web 請求友好,都是以text/html
的方式返回錯誤描述,對api
不友好,api
當然是json
)。
注冊異常處理器
yii2
也是以 controller/action
的方式定義一個異常處理器的,我們可以在 components=>errorHandler
中自定義。
# config/web.php
'components' => [
'errorHandler' => [
'errorAction' => 'exception/handler'
]
]
異常處理器
定義相應的異常處理器,app\actions\ErrorApiAction
繼承 yii\web\ErrorAction
,可以拿到yii2
為我們整理好的全局異常。
# controllers/ExceptionController.php
?php
namespace app\controllers;
use yii\web\Controller;
class ExceptionController extends Controller
{
/**
* 為 actionHandler 掛載獨立的 action
* @return array
*/
public function actions()
{
return [
'handler' => [
'class' => 'app\actions\ErrorApiAction',
]
];
}
}
對api
友好的錯誤異常處理器,這里我也只是簡單的把響應格式改了一下,異常的上下文還是用yii2
自帶的處理的。
#actions/ErrorApiAction.php
?php
/**
* @author wangzhijian@styd.com
* @date 2019-5-13 17:20:10
* Api 全局錯誤異常處理器
*/
namespace app\actions;
use Yii;
use yii\web\ErrorAction;
use yii\web\Response;
class ErrorApiAction extends ErrorAction
{
public function run()
{
// 根據(jù)異常類型設定相應的響應碼
Yii::$app->getResponse()->setStatusCodeByException($this->exception);
// json 格式返回
Yii::$app->getResponse()->format = Response::FORMAT_JSON;
// 返回的內容數(shù)據(jù)
return [
'msg' => $this->exception->getMessage(),
'err' => $this->exception->getCode()
];
}
}
異常實體
主要是簡單的把狀態(tài)碼的傳遞封裝一下,用更容易理解的類名來代理傳遞。
exceptions/HttpException.php
?php
/**
* app 異?;A類
*/
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ù)據(jù),絕對的2xx
響應簇
throw new HttpBadRequestException("具體的非法描述", 4001);
throw new HttpUnauthorizedException("請認證后訪問");
throw new HttpForbiddenException("無權訪問");
throw new HttpNotFoundException("請求資源不存在");
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
您可能感興趣的文章:- 實例講解如何在PHP的Yii框架中進行錯誤和異常處理
- YII Framework教程之異常處理詳解