yii2中表单验证失败时需用geterrors()获取字段级错误数组或geterrorsummary(true)获取扁平化错误列表,控制器中通过asjson返回含success、message和errors的标准json响应,前端据此精准渲染或全局提示。

在 Yii2 中,当表单验证失败时,默认返回的是 Model 对象的错误信息,但若需以 JSON 格式统一输出所有验证错误(例如用于 AJAX 表单提交),需要手动提取并结构化这些错误。
获取模型全部验证错误并转为数组
Yii2 的 Model 类提供 getErrors() 方法,它返回一个关联数组:键为字段名,值为该字段的所有错误消息数组。若要扁平化为「字段 → 错误字符串」或「全部错误汇总」,可进一步处理:
-
$model->getErrors():返回完整错误结构,如['username' => ['用户名不能为空'], 'email' => ['邮箱格式不正确']] -
$model->getErrorSummary(true):返回所有错误的扁平化一维数组(含模型级错误),适合做全局提示,如['用户名不能为空', '邮箱格式不正确']
控制器中返回标准 JSON 错误响应
在控制器动作中(尤其配合 AJAX 请求),推荐统一返回含状态码、消息和错误详情的 JSON:
if ($model->load(Yii::$app->request->post()) && $model->validate()) {
// 验证通过,执行保存等逻辑
return $this->asJson(['success' => true, 'message' => '保存成功']);
} else {
// 验证失败,返回全部错误
return $this->asJson([
'success' => false,
'message' => '表单填写有误',
'errors' => $model->getErrors(), // 或 $model->getErrorSummary(true)
]);
}
前端接收并展示错误(简要示例)
前端用 JS 接收响应后,可按需渲染:
- 遍历
response.errors对象,将每个字段的错误插入对应 input 下方 - 使用
response.errors(字段维度)便于精准定位;用response.errorSummary(扁平数组)适合顶部全局提示栏 - 注意:Yii2 默认不会自动触发客户端验证,AJAX 提交前建议仍保留
ActiveForm的客户端校验(enableClientValidation => true)作第一道防线
补充:自定义错误格式(如合并为单条字符串)
若接口要求所有错误拼成一条提示,可用以下方式:
$allErrors = [];
foreach ($model->getErrors() as $field => $messages) {
foreach ($messages as $msg) {
$allErrors[] = "$field:$msg";
}
}
$errorsString = implode(';', $allErrors); // 如 "用户名:不能为空;邮箱:邮箱格式不正确"
再将其写入 JSON 响应的 message 或独立字段即可。











