Yii2表单验证返回JSON错误的核心是禁用HTML渲染、手动验证并返回结构化JSON:控制器中调用load()和validate(),失败时设Response::FORMAT_JSON并返回['success'=>false,'errors'=>$model->getErrors()]。

Yii2 表单验证返回 JSON 错误,核心是禁用默认 HTML 渲染、捕获验证失败并以 JSON 格式响应。关键在于控制器中正确处理模型验证结果,并统一返回结构化错误数据。
在控制器中手动触发验证并返回 JSON
不依赖 ActiveForm 的自动提交行为,而是通过 AJAX 提交到一个独立动作(如 actionCreate 或 actionValidate),在该动作中验证模型并输出 JSON:
- 调用
$model->load(Yii::$app->request->post())加载数据 - 用
$model->validate()执行验证(不调用save()) - 若验证失败,用
$model->getErrors()获取字段级错误信息 - 使用
Yii::$app->response->format = Response::FORMAT_JSON设置响应格式 - 返回包含
success: false和errors字段的数组
示例代码:
public function actionCreate()
{
$model = new Article();
if ($model->load(Yii::$app->request->post()) && $model->validate()) {
$model->save();
return ['success' => true, 'message' => '保存成功'];
}
Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
return [
'success' => false,
'errors' => $model->getErrors(),
];
}
前端 AJAX 提交与错误显示
前端用 jQuery 或 fetch 提交表单,接收 JSON 响应后解析 errors 并注入到对应字段下方:
-
errors是关联数组,键为属性名(如'title'),值为字符串数组(如['标题不能为空', '标题长度不能超过 100 字符']) - 可遍历
response.errors,用$('[name="Article[title]"]').next('.error').text(...)更新提示 - 建议统一清空旧错误再写入新错误,避免残留
全局配置:让所有验证失败都返回 JSON(可选)
若项目全站走 API 模式,可在 config/web.php 中配置 beforeAction 或自定义基控制器,对 AJAX 请求自动切换响应格式:
- 判断
Yii::$app->request->isAjax或请求头X-Requested-With: XMLHttpRequest - 在验证失败时主动终止视图渲染,直接返回 JSON
- 注意:此方式需谨慎,避免影响后台管理页等非 API 场景
补充:自定义验证错误格式(更友好)
默认 getErrors() 返回嵌套数组,如 ['title' => ['xxx']]。如需扁平化或带字段标签,可封装辅助方法:
- 用
$model->getAttributeLabel('title')替换字段名为中文名 - 合并同一字段多个错误为一句,例如
"标题:不能为空;长度不能超过 100 字符" - 返回结构如
['title' => '标题不能为空']更利于前端直接映射


















