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 [ 'class' => 'app\actions\ErrorApiAction', ] ]; } } 对api友好的错误异常处理器,这里我也只是简单的把响应格式改了一下,异常的上下文还是用yii2自带的处理的。 #actions/ErrorApiAction.php getResponse()->setStatusCodeByException($this->exception); // json 格式返回 Yii::$app->getResponse()->format = Response::FORMAT_JSON; // 返回的内容数据 return [ 'msg' => $this->exception->getMessage(), 'err' => $this->exception->getCode() ]; } } 异常实体 主要是简单的把状态码的传递封装一下,用更容易理解的类名来代理传递。 exceptions/HttpException.php statusCode, $message, $code, $previous); } } exceptions/HttpForbiddenException.php