亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

yii2 開(kāi)發(fā)api接口時(shí)優(yōu)雅的處理全局異常的方法

 更新時(shí)間:2019年05月14日 09:24:05   作者:big_cat  
這篇文章主要介紹了yii2 開(kāi)發(fā)api接口時(shí)優(yōu)雅的處理全局異常的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

前言:個(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 友好(yii2yii\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)

    創(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-04
  • PHP實(shí)現(xiàn)打包zip并下載功能

    PHP實(shí)現(xiàn)打包zip并下載功能

    這篇文章主要介紹了PHP實(shí)現(xiàn)打包zip并下載功能,代碼簡(jiǎn)單易懂,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2018-06-06
  • php利用云片網(wǎng)實(shí)現(xiàn)短信驗(yàn)證碼功能的示例代碼

    php利用云片網(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-11
  • php讀取qqwry.dat ip地址定位文件的類(lèi)實(shí)例代碼

    php讀取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-11
  • php微信開(kāi)發(fā)之谷歌測(cè)距

    php微信開(kāi)發(fā)之谷歌測(cè)距

    這篇文章主要為大家詳細(xì)介紹了php微信開(kāi)發(fā)之谷歌測(cè)距的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-06-06
  • PHP實(shí)現(xiàn)頁(yè)面靜態(tài)化深入講解

    PHP實(shí)現(xiàn)頁(yè)面靜態(tài)化深入講解

    這篇文章主要介紹了PHP實(shí)現(xiàn)頁(yè)面靜態(tài)化深入講解,本文講解的很透徹,有感興趣的同學(xué)可以研究下
    2021-03-03
  • PHP判斷表達(dá)式中括號(hào)是否匹配的簡(jiǎn)單實(shí)例

    PHP判斷表達(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
  • PHP單文件和多文件上傳實(shí)例

    PHP單文件和多文件上傳實(shí)例

    本篇文章給大家詳細(xì)分析了PHP實(shí)現(xiàn)單文件上傳和多文件上傳的代碼以及問(wèn)題解決方案,一起學(xué)習(xí)參考下。
    2017-12-12
  • Laravel框架使用Redis的方法詳解

    Laravel框架使用Redis的方法詳解

    這篇文章主要介紹了Laravel框架使用Redis的方法,結(jié)合實(shí)例形式較為詳細(xì)的分析了Laravel框架中Redis數(shù)據(jù)庫(kù)配置、使用方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下
    2018-05-05
  • PHP遠(yuǎn)程調(diào)試之XDEBUG

    PHP遠(yuǎn)程調(diào)試之XDEBUG

    開(kāi)發(fā)的時(shí)候我都是使用XDebug在本地調(diào)試,但是最近加入一些項(xiàng)目中去,環(huán)境太復(fù)雜了,要在本地搭建一個(gè)開(kāi)發(fā)環(huán)境真的太麻煩了,那么我們?cè)趺词褂脁debug來(lái)遠(yuǎn)程調(diào)試呢?下面通過(guò)本篇文章給大家介紹php xdebug遠(yuǎn)程調(diào)試方法,感興趣的朋友一起看看吧
    2015-12-12

最新評(píng)論