怎么在yii2中开发api接口时处理全局异常?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。
注册异常处理器
yii2
也是以 controller/action
的方式定义一个异常处理器的,我们可以在 components=>errorHandler
中自定义。
# config/web.php 'components' => [ 'errorHandler' => [ 'errorAction' => 'exception/handler' ] ]
异常处理器
定义相应的异常处理器,app\actions\ErrorApiAction
继承 yii\web\ErrorAction
,可以拿到yii2
为我们整理好的全局异常。
# controllers/ExceptionController.php <?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 <?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
<?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; }
使用范例
在一些 service logic model
中根据需要即时抛出异常即可,上层控制器拿到的永远都是正常的返回数据,绝对的2xx
响应簇
throw new HttpBadRequestException("具体的非法描述", 4001); throw new HttpUnauthorizedException("请认证后访问"); throw new HttpForbiddenException("无权访问"); throw new HttpNotFoundException("请求资源不存在");
关于怎么在yii2中开发api接口时处理全局异常问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注亿速云行业资讯频道了解更多相关知识。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。