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中自定义。
- # config/web.php
- 'components' => [
- 'errorHandler' => [
- 'errorAction' => 'exception/handler'
- ]
- ]
异常处理器
定义相应的异常处理器,app\actions\ErrorApiAction 继承 yii\web\ErrorAction,可以拿到yii2为我们整理好的全局异常。
- # controllers/ExceptionController.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
- /**
- * @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
- /**
- * 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
- /**
- * 400 bad request
- */
- namespace app\exceptions;
- class HttpBadRequestException extends HttpException
- {
- public $statusCode = 400;
- }
exceptions/HttpUnauthorizedException.php
- /**
- * 401 unauthorized
- */
- namespace app\exceptions;
- class HttpUnauthorizedException extends HttpException
- {
- public $statusCode = 401;
- }
exceptions/HttpForbiddenException.php
- /**
- * 403 forbidden
- */
- namespace app\exceptions;
- class HttpForbiddenException extends HttpException
- {
- public $statusCode = 403;
- }
exceptions/HttpNotFoundException.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("请求资源不存在");
Tags: yii2处理全局异常 api接口
相关文章
- ·在Laravel中使用GuzzleHttp调用第三方服务的API接口代码(2022-01-05)
推荐文章
热门文章
最新评论文章
- 写给考虑创业的年轻程序员(10)
- PHP新手上路(一)(7)
- 惹恼程序员的十件事(5)
- PHP邮件发送例子,已测试成功(5)
- 致初学者:PHP比ASP优秀的七个理由(4)
- PHP会被淘汰吗?(4)
- PHP新手上路(四)(4)
- 如何去学习PHP?(2)
- 简单入门级php分页代码(2)
- php中邮箱email 电话等格式的验证(2)