yii2中将表单验证错误转为json返回,需封装为status:false、message:"验证失败"、errors:$model->errors的结构,设置响应格式为json并返回422状态码。

Yii2 中将表单验证错误对象转为 JSON 返回,核心是把 $model->errors(关联数组)结构化处理后用 Json::encode() 输出即可,同时注意设置响应头和状态码以符合 API 规范。
获取验证错误并格式化为标准 JSON 结构
验证失败后,$model->errors 是一个以属性名为键、错误信息数组为值的多维数组。直接返回它可能不符合前端预期(比如希望扁平化或带统一字段)。推荐封装为如下结构:
- status: false
- message: "验证失败"
-
errors: 关联数组,如
{"username": ["用户名不能为空"], "email": ["邮箱格式不正确"]}
示例代码:
use yii\helpers\Json;
if ($model->load(Yii::$app->request->post()) && !$model->validate()) {
$response = [
'status' => false,
'message' => '验证失败',
'errors' => $model->errors,
];
Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
return $response;
}
确保响应头和状态码正确
若手动 echo 或使用 exit,容易遗漏 HTTP 状态码。建议让 Yii 自动处理:
- 设置
Yii::$app->response->format = \yii\web\Response::FORMAT_JSON,框架会自动设Content-Type: application/json - 验证失败时返回 422(Unprocessable Entity)更语义化:
Yii::$app->response->setStatusCode(422);
统一错误响应(可选进阶)
项目中建议封装一个通用方法,避免重复逻辑。例如在 BaseController 中添加:
protected function responseValidationError($model)
{
Yii::$app->response->setStatusCode(422);
Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
return [
'status' => false,
'message' => '参数验证失败',
'errors' => $model->errors,
];
}
控制器中直接调用:return $this->responseValidationError($model);
注意点
-
$model->errors只在validate()或save()后才可用;仅load()不触发验证 - 若模型有自定义验证规则(如
inline validator),确保其正确向$this->addError()添加错误 - 中文错误信息需确认项目字符集为 UTF-8,JSON 编码不会乱码











