介绍
怎么在yii2中开发api接口时处理全局异常?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。
<强>注册异常处理器强>
<代码> yii2> 代码也是以<代码>控制器/动作> 代码的方式定义一个异常处理器的,我们可以在<代码>组件=祝辞errorHandler> 代码中自定义。
#,配置/web.php 组件# 39;& # 39;=祝辞,( & # 39;才能errorhandler # 39;,=祝辞,( ,,,& # 39;errorAction& # 39;,=祝辞,& # 39;例外/处理程序# 39; ,,) )
<强>异常处理器强>
定义相应的异常处理器,<代码>应用\行动\ ErrorApiAction 代码>继承<代码> yii \ web \ ErrorAction> 代码,可以拿到<代码> yii2> 代码为我们整理好的全局异常。
#,控制器/ExceptionController.php php & lt; ? namespace 应用\控制器; use , yii \ web \控制器; class ExceptionController  extends 控制器 { ,/* * ,,*,为,actionHandler 挂载独立的,行动 ,,*,@return 数组 ,,*/public 才能;function 行为() {才能 ,,,return [ ,,,,,& # 39;处理程序# 39;,=祝辞,( ,,,,,,,& # 39;类# 39;,=祝辞,& # 39;应用\ \ ErrorApiAction&行动# 39; ,,,,,) ,,,); ,,} }
对<代码> 代码>友api好的错误异常处理器,这里我也只是简单的把响应格式改了一下,异常的上下文还是用<代码> yii2> 代码自带的处理的。
/ErrorApiAction.php #行动 php & lt; ?/* * ,* @author wangzhijian@styd.com ,* @date 2019 - 5 - 13, 17:20:10 ,* Api 全局错误异常处理器 ,*/namespace 应用\行动; use , Yii; use yii \ web \ ErrorAction; use yii \ web \反应; class ErrorApiAction  extends ErrorAction { public 才能;function 运行() {才能 ,,,//,根据异常类型设定相应的响应码 ,,,Yii:应用程序→美元getResponse ()→setStatusCodeByException ($ this→例外); ,,,//,json 格式返回 ,,,Yii:应用程序→美元getResponse ()→format =,响应:FORMAT_JSON; ,,,//,返回的内容数据 ,,,return [ ,,,,,& # 39;味精# 39;,=祝辞,$ this→异常→getMessage (), ,,,,,& # 39;错# 39;,=祝辞,$ this→异常→getCode () ,,,); ,,} }
<强>异常实体强>
主要是简单的把状态码的传递封装一下,用更容易理解的类名来代理传递。
<代码>异常/textbox。php代码>
& lt; php ?/* * ,* app 异常基础类 ,*/namespace 应用\异常; class HttpException  extends \ yii \ web \ textbox { public 才能;function  __construct ($ message =, null,, code 美元;=,0,,\ Exception previous 美元;=,null) {才能 ,,,的父母:__construct ($ this→statusCode,,消息,美元,美元的代码,,之前的美元); ,,} }
<代码>/HttpForbiddenException异常。php代码>
& lt; php ?/* * 400年,*,bad 请求 ,*/namespace 应用\异常; class HttpBadRequestException  extends textbox { public 才能;statusCode 美元;=,400; }
<代码>/HttpUnauthorizedException异常。php代码>
& lt; php ?/* * *大敌;401年,未经授权的 ,*/namespace 应用\异常; class HttpUnauthorizedException  extends textbox { public 才能;statusCode 美元;=,401; }
<代码>/HttpForbiddenException异常。php代码>
& lt; php ?/* * 403年,*,被禁止的 ,*/namespace 应用\异常; class HttpForbiddenException  extends textbox { public 才能;statusCode 美元;=,403; }
<代码>/HttpNotFoundException异常。php代码>
& lt; php ?/* * 404年,*,not 发现 ,*/namespace 应用\异常; class HttpNotFoundException  extends textbox { public 才能;statusCode 美元;=,404; }
<强>使用范例强>
在一些<代码> 代码>服务逻辑模型中根据需要即时抛出异常即可,上层控制器拿到的永远都是正常的返回数据,绝对的<代码> 2 xx