在 yii2 中实现表单 ajax 提交并返回 json 验证结果,需禁用自动跳转、手动验证模型、统一返回标准 json 结构,并在前端拦截提交事件处理响应。

在 Yii2 中,若希望表单提交后不跳转页面、而是返回 JSON 格式的验证结果(例如用于 AJAX 提交),需关闭默认的重定向行为,并手动控制响应格式。核心在于:禁用自动跳转、捕获验证错误、统一输出 JSON。
1. 禁用控制器中的自动跳转
Yii2 的 Model::save() 或 ActiveForm 默认可能触发重定向(尤其在使用 redirect() 或场景中配置了 success redirect)。确保控制器动作中不调用 $this->redirect(),且仅在 AJAX 请求时返回 JSON:
- 用
Yii::$app->request->isAjax判断是否为 AJAX 请求 - 避免在验证失败或成功后写
return $this->redirect(...) - 直接
return $this->asJson([...])返回结构化数据
2. 主动触发模型验证并收集错误
即使未调用 save(),也可手动验证模型并获取错误信息:
-
$model->load(Yii::$app->request->post())加载数据 -
$model->validate()执行验证(不保存) -
$model->getErrors()获取字段级错误数组,格式为['username' => ['用户名不能为空']] - 验证通过时可再调用
$model->save(),失败则仍返回错误 JSON
3. 统一 JSON 响应结构示例
推荐返回标准化 JSON,前端容易处理:
{
"success": false,
"errors": {
"username": ["用户名不能为空"],
"email": ["邮箱格式不正确"]
}
}
控制器中可这样写:
if ($model->load($request->post()) && $model->validate()) {
if ($model->save()) {
return $this->asJson(['success' => true, 'message' => '保存成功']);
}
}
return $this->asJson([
'success' => false,
'errors' => $model->getErrors()
]);
4. 前端配合:阻止表单默认提交 + 处理 JSON
在视图中,用 JavaScript 拦截表单 submit 事件,发送 AJAX 并解析返回的 JSON:
- 给表单加
data-pjax="0"或移除ActiveForm的自动提交逻辑 - 用
$.post()或fetch()提交,检查响应中的success字段 - 若
errors存在,遍历并插入到对应字段下方(可用yii.activeForm的 API 触发错误显示)











