Yii2 自定义异常类和返回JSON格式
在开发API时,为保证数据的安全,会对一些非法或者不合理的数据进行校验。当发现并不是我们想要的数据我们要怎么告知API的调用者呢?还没有使用异常类处理时,我们也许是这样处理的:
return json_encode([
'message' => '参数错误',
'code' => 201
]);
如果想通过下面这种方式手动抛异常的方法告知API调用者,如何定义异常类呢:
$model = null;
if (!$model) {
throw new ApiException('参数错误');
}
Yii2中处理异常是比较容易的,接下来自定义一个API异常类,这里用的是Yii2高级模板:
配置文件main.php中配置errorHandler 组件,通过controller/action的方式来处理
<?php
# frontend/config/main.php
return [
'components' => [
.....
'errorHandler' => [
'errorAction' => 'site/error',
],
]
];
定义controller/action
<?php
# frontend/controllers/SiteController.php
/**
* Class SiteController
* @package frontend\controllers
*
*/
class SiteController extends Controller
{
/**
* @return array
*/
public function actions()
{
return [
'error' => [
'class' => '\common\actions\ErrorApiAction'
]
];
}
}
<?php
# common/actions/ErrorApiAction.php
namespace common\actions;
use Yii;
use yii\web\ErrorAction;
use yii\web\Response;
/**
* Class ApiException
*
* @package common\exceptions
*/
class ErrorApiAction extends ErrorAction
{
/**
* @return array|string
*/
public function run()
{
// 设置响应码响应码
Yii::$app->getResponse()->setStatusCodeByException($this->exception);
// 设置返回格式:JSON
Yii::$app->getResponse()->format = Response::FORMAT_JSON;
// 封装返回的内容
return [
'message' => $this->exception->getMessage(),
'code' => $this->exception->getCode()
];
}
}
定义异常类
# common/exceptions/ApiException.php
<?php
namespace common\exceptions;
use Exception;
use yii\web\HttpException;
/**
* Class ApiException
*
* @package common\exceptions
*/
class ApiException extends HttpException
{
public function __construct($message = null, $code = 0, Exception $previous = null)
{
parent::__construct($this->statusCode, $message, $code, $previous);
}
}
测试
# frontend/controllers/SiteController.php
public function actionTest()
{
throw new ApiException('参数错误');
}
访问site/test,返回结果:
{"message":"参数错误","code":0}