国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > PHP > 正文

yii2 開發api接口時優雅的處理全局異常的方法

2024-05-05 00:09:05
字體:
來源:轉載
供稿:網友

前言:個人覺得,學習或溫習一套Web框架,在快速閱讀一遍文檔后,應從路由,控制器,請求/響應對象,數據模型(Logic,Dao,Entity),全局異常處理幾個方面下手,這幾項了解后,框架上手就游刃有余了。然后我比較喜歡在開工前整理好框架的全局異常處理,方便寫 api時錯誤的統一響應。

api接口的開發過程中,我們需要對用戶數據進行嚴格的校驗,防止非法輸入對服務產生安全問題,在開發過程中,我比較喜歡即時的以拋出異常的方式中斷請求的處理,并以全局異常處理器格式化處理后統一返回給客戶端。

今天就把 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<?phpnamespace 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()  {    // 根據異常類型設定相應的響應碼    Yii::$app->getResponse()->setStatusCodeByException($this->exception);    // json 格式返回    Yii::$app->getResponse()->format = Response::FORMAT_JSON;    // 返回的內容數據    return [      'msg' => $this->exception->getMessage(),      'err' => $this->exception->getCode()    ];  }}

異常實體

主要是簡單的把狀態碼的傳遞封裝一下,用更容易理解的類名來代理傳遞。
exceptions/HttpException.php

<?php/** * app 異常基礎類 */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 中根據需要即時拋出異常即可,上層控制器拿到的永遠都是正常的返回數據,絕對的2xx響應簇

throw new HttpBadRequestException("具體的非法描述", 4001);throw new HttpUnauthorizedException("請認證后訪問");throw new HttpForbiddenException("無權訪問");throw new HttpNotFoundException("請求資源不存在");

yii2,api,全局異常

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到PHP教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 灌阳县| 安多县| 澎湖县| 瑞丽市| 梧州市| 横山县| 鄂托克前旗| 华容县| 绥德县| 遂溪县| 乌审旗| 三亚市| 洞头县| 昭平县| 绥江县| 平塘县| 田林县| 荔波县| 岚皋县| 信丰县| 石阡县| 盐山县| 大荔县| 建湖县| 沧州市| 老河口市| 梁平县| 泾阳县| 广南县| 宁安市| 平乡县| 嘉祥县| 太仆寺旗| 利津县| 苍溪县| 永福县| 昌黎县| 扎鲁特旗| 曲沃县| 大冶市| 方正县|