Yii2表单验证失败时,推荐返回标准JSON结构:{"code":422,"message":"验证失败","errors":{"username":["用户名不能为空"],"email":["邮箱格式不正确"]}},其中errors直接使用$model->getErrors()结果,无需额外转换。

Yii2 表单验证失败后,默认返回的是一个嵌套的 Array,比如:['username' => ['用户名不能为空', '用户名长度不能超过10个字符']]。若需以 JSON 格式返回给前端(如 AJAX 提交),需将其规范转换为标准 JSON 结构,常见做法是转成键值对形式或扁平化错误列表。
使用 getErrors() 获取并格式化
在控制器中调用模型的 getErrors() 方法,它返回的是字段名 → 错误消息数组的结构。可进一步处理为更易前端解析的格式:
- 保留字段维度:每个字段对应一个字符串(取第一条错误)或字符串数组
- 扁平化为一维错误列表:适合统一提示,不强调字段归属
- 添加状态码和 message 包裹,符合 REST 接口习惯
推荐的 JSON 返回结构示例
建议采用以下结构,兼顾语义清晰与前端友好:
{
"code": 422,
"message": "验证失败",
"errors": {
"username": ["用户名不能为空"],
"email": ["邮箱格式不正确"]
}
}
其中 code 使用 HTTP 422 Unprocessable Entity 更准确(Yii2 默认也支持此状态码)。
控制器中返回 JSON 的写法
在 action 中验证失败时,直接输出 JSON 响应:
if ($model->load(Yii::$app->request->post()) && !$model->validate()) {
Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
Yii::$app->response->setStatusCode(422);
return [
'code' => 422,
'message' => '验证失败',
'errors' => $model->getErrors(), // 已是字段 => [msg] 数组
];
}
注意:$model->getErrors() 返回的就是你要的「字段名 → 错误消息数组」结构,无需额外遍历转换,直接作为 errors 值即可。
前端接收与使用提示
AJAX 成功回调中,可直接读取 response.errors:
- 遍历
Object.keys(errors)定位字段 - 每个字段的
errors[field][0]是首条提示(常用) - 也可拼接全部:
errors[field].join(';')


















