前言:个人觉得,学习或温习一套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;u yii\web\controller;class exceptioncontr云南昆明发生惨烈车祸 2人身亡oller 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;u yii;u yii\web\erroraction;u yii\web\respon疫情报告制度;class errorapiaction extends erroraction{ public function run() { // 根据异常类型设定相应的响应码 yii::$app->getrespon()->tstatuscodebyexception($this->exception); // json 格式返回 yii::$app->getrespon()->format = respon::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;}
使用范例
在一些 rvice logic model
中根据需要即时抛出异常即可,上层控制器拿到的永远都是正常的返回数据,绝对的2xx
响应簇
throw new httpbadrequestexception("具体的非法描述", 4001);throw new httpunauthorizedexception("请认证后访问");throw new httpforbiddenexception("无权访问");throw new httpnotfoundexception("请求资源不存在");
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持www.887551.com。
本文发布于:2023-04-07 09:50:16,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/bd3713ae8c091b3ea04f6802b68074e9.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:yii2 开发api接口时优雅的处理全局异常的方法.doc
本文 PDF 下载地址:yii2 开发api接口时优雅的处理全局异常的方法.pdf
留言与评论(共有 0 条评论) |