Yii2 自定义异常类和返回JSON格式

作者:IT技术圈子 浏览量:360   更新于 2023-09-03 13:23 标签:

在开发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}