当前位置:首页 > CMS教程 > 其它CMS > 列表

yii2 开发api接口时优雅的处理全局异常的方法

发布:smiling 来源: PHP粉丝网  添加日期:2021-11-22 23:10:48 浏览: 评论:0 

这篇文章主要介绍了yii2 开发api接口时优雅的处理全局异常的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。

前言:个人觉得,学习或温习一套Web框架,在快速阅读一遍文档后,应从路由,控制器,请求/响应对象,数据模型(Logic,Dao,Entity),全局异常处理几个方面下手,这几项了解后,框架上手就游刃有余了,然后我比较喜欢在开工前整理好框架的全局异常处理,方便写 api时错误的统一响应。

在api接口的开发过程中,我们需要对用户数据进行严格的校验,防止非法输入对服务产生安全问题,在开发过程中,我比较喜欢即时的以抛出异常的方式中断请求的处理,并以全局异常处理器格式化处理后统一返回给客户端。

今天就把 yii2 自带的全局异常处理器改写至对 api 友好(yii2的 yii\web\HttpException默认对 web 请求友好,都是以text/html的方式返回错误描述,对api不友好,api当然是json)。

注册异常处理器

yii2也是以 controller/action 的方式定义一个异常处理器的,我们可以在 components=>errorHandler中自定义。

  1. # config/web.php 
  2. 'components' => [ 
  3.   'errorHandler' => [ 
  4.     'errorAction' => 'exception/handler' 
  5.   ] 

异常处理器

定义相应的异常处理器,app\actions\ErrorApiAction 继承 yii\web\ErrorAction,可以拿到yii2为我们整理好的全局异常。

  1. # controllers/ExceptionController.php 
  2.  
  3. namespace app\controllers; 
  4.  
  5. use yii\web\Controller; 
  6.  
  7. class ExceptionController extends Controller 
  8.   /** 
  9.    * 为 actionHandler 挂载独立的 action 
  10.    * @return array 
  11.    */ 
  12.   public function actions() 
  13.   { 
  14.     return [ 
  15.       'handler' => [ 
  16.         'class' => 'app\actions\ErrorApiAction'
  17.       ] 
  18.     ]; 
  19.   } 

对api友好的错误异常处理器,这里我也只是简单的把响应格式改了一下,异常的上下文还是用yii2自带的处理的。

  1. #actions/ErrorApiAction.php 
  2. /** 
  3.  * @author wangzhijian@styd.com 
  4.  * @date 2019-5-13 17:20:10 
  5.  * Api 全局错误异常处理器 
  6.  */ 
  7.  
  8. namespace app\actions; 
  9.  
  10. use Yii; 
  11. use yii\web\ErrorAction; 
  12. use yii\web\Response; 
  13.  
  14. class ErrorApiAction extends ErrorAction 
  15.   public function run() 
  16.   { 
  17.     // 根据异常类型设定相应的响应码 
  18.     Yii::$app->getResponse()->setStatusCodeByException($this->exception); 
  19.     // json 格式返回 
  20.     Yii::$app->getResponse()->format = Response::FORMAT_JSON; 
  21.     // 返回的内容数据 
  22.     return [ 
  23.       'msg' => $this->exception->getMessage(), 
  24.       'err' => $this->exception->getCode() 
  25.     ]; 
  26.   } 

异常实体

主要是简单的把状态码的传递封装一下,用更容易理解的类名来代理传递。

exceptions/HttpException.php

  1. /** 
  2.  * app 异常基础类 
  3.  */ 
  4.  
  5. namespace app\exceptions; 
  6.  
  7. class HttpException extends \yii\web\HttpException 
  8.   public function __construct($message = null, $code = 0, \Exception $previous = null) 
  9.   { 
  10.     parent::__construct($this->statusCode, $message$code$previous); 
  11.   } 

exceptions/HttpForbiddenException.php

  1. /** 
  2.  * 400 bad request 
  3.  */ 
  4.  
  5. namespace app\exceptions; 
  6.  
  7. class HttpBadRequestException extends HttpException 
  8.   public $statusCode = 400; 

exceptions/HttpUnauthorizedException.php

  1. /** 
  2.  * 401 unauthorized 
  3.  */ 
  4.  
  5. namespace app\exceptions; 
  6.  
  7. class HttpUnauthorizedException extends HttpException 
  8.   public $statusCode = 401; 

exceptions/HttpForbiddenException.php

  1. /** 
  2.  * 403 forbidden 
  3.  */ 
  4.  
  5. namespace app\exceptions; 
  6.  
  7. class HttpForbiddenException extends HttpException 
  8.   public $statusCode = 403; 

exceptions/HttpNotFoundException.php

  1. /** 
  2.  * 404 not found 
  3.  */ 
  4.  
  5. namespace app\exceptions; 
  6.  
  7. class HttpNotFoundException extends HttpException 
  8.   public $statusCode = 404; 

使用范例

在一些 service logic model 中根据需要即时抛出异常即可,上层控制器拿到的永远都是正常的返回数据,绝对的2xx响应簇

throw new HttpBadRequestException("具体的非法描述", 4001);

throw new HttpUnauthorizedException("请认证后访问");

throw new HttpForbiddenException("无权访问");

throw new HttpNotFoundException("请求资源不存在");

yii2处理全局异常 api接口

Tags: yii2处理全局异常 api接口

分享到: