Yii2表单验证失败返回JSON需禁用HTML渲染、调用validate()、用getErrors()获取错误、设response格式为JSON并返回含success和errors的数组。

Yii2 表单验证失败时返回 JSON 格式错误信息,关键在于:禁用默认 HTML 渲染、手动触发验证、统一格式化错误并响应 JSON。
控制器中正确返回验证错误 JSON
在控制器动作里,不要直接调用 $model->save() 或依赖视图渲染,而是显式验证并构造 JSON 响应:
- 调用
$model->validate()主动触发规则检查 - 若验证失败,用
$model->getErrors()获取字段级错误数组 - 使用
Yii::$app->response->format = Response::FORMAT_JSON设定响应格式 - 返回结构清晰的数组,例如:
['success' => false, 'errors' => $model->getErrors()]
示例代码:
use yii\web\Response;
public function actionCreate()
{
$model = new Post();
if ($model->load(Yii::$app->request->post()) && $model->validate()) {
$model->save();
return ['success' => true, 'data' => $model->attributes];
}
Yii::$app->response->format = Response::FORMAT_JSON;
return [
'success' => false,
'errors' => $model->getErrors(),
'message' => '表单填写有误,请检查'
];
}
确保请求是 AJAX 且不跳转
前端需以 AJAX 提交(如 jQuery 或 fetch),避免传统表单提交导致页面刷新:
- 表单添加
data-pjax="0"或移除 pjax 干扰(如使用 Pjax 小部件) - 禁用 Yii 默认的客户端验证干扰(可选):
ActiveForm::begin(['enableClientValidation' => false]) - 后端无需判断是否为 AJAX 请求,但建议加简单校验提升健壮性:
Yii::$app->request->isAjax
模型规则与错误提示定制
验证错误能否准确返回,取决于模型中规则定义是否合理:
- 每个字段规则应明确,例如:
['title', 'required', 'message' => '标题不能为空'] - 自定义验证方法需在
addError()中指定字段:$this->addError('price', '价格必须大于 0') - 批量验证字段(如两个密码一致)应在
rules()中用['password_repeat', 'compare', 'compareAttribute' => 'password']
这样 $model->getErrors() 才会按字段键名组织,前端容易映射到对应输入框。
前端接收并展示 JSON 错误(简要示意)
JavaScript 接收后可遍历 errors 对象,将提示插入对应字段旁:
$.post('/post/create', formData)
.done(function(res) {
if (res.success) {
alert('提交成功');
} else {
$('.error-summary').remove();
$.each(res.errors, function(field, messages) {
var $input = $('[name="' + field + '"]');
var $helpBlock = $input.next('.help-block');
if ($helpBlock.length === 0) {
$helpBlock = $('<div class="help-block"></div>').insertAfter($input);
}
$helpBlock.html(messages[0]); // 显示第一条错误
});
}
});


















