yii2处理json表单需三步:1.确认前端content-type为application/json;2.配置request组件启用jsonparser;3.控制器中用load()配空前缀或手动decode赋值,并设响应格式为json。

在 Yii2 中处理前端以 application/json 方式提交的表单数据时,验证失败、errors 为空、post() 拿不到字段值——这些问题根本不是验证器写错了,而是 JSON 数据压根没进模型,验证自然无从谈起。
确认请求确实是 JSON 格式
打开浏览器开发者工具 → Network → 找到对应请求 → 查看 Headers 标签页下的 Request Headers → 确认 Content-Type 是 application/json(或带 charset 的变体,如 application/json;charset=UTF-8)。
如果看到的是 application/x-www-form-urlencoded,说明前端 JS 实际发的是表单数据,却误用了 JSON.stringify();此时应检查是否漏设 headers 或误配了 axios/fetch 的 contentType 配置。
后端必须启用 JSON 解析器
Yii2 默认不解析 application/json 请求体,需手动在 config/web.php 的 request 组件中添加 parsers 配置:
找到 'components' => ['request' => [...]] 这一段,在 'request' 数组内加入:
'parsers' => ['application/json' => 'yii\web\JsonParser']
【必须保留 cookieValidationKey】,否则 CSRF 校验会直接报错中断流程。
配置生效后,Yii::$app->request->post() 和 getBodyParams() 才能读取到解析后的数组,而不是空值。
控制器中正确加载并验证数据
方法一:用 load() 加载(推荐)
第一步:实例化模型,例如 $model = new User();
Miller (mlr) 是一个命令行工具,用于查询、整形和重新格式化名称索引数据,如 CSV、TSV、JSON 和 JSON Lines。它将 awk、sed、cut、join 和 sort 的功能整合到一个专为结构化数据处理而构建的单一工具中。
第二步:调用 $model->load(Yii::$app->request->getBodyParams(), '');注意第二个参数传空字符串,否则 load() 会按默认 formName() 去匹配键名,而 JSON 请求没有表单前缀,必然失败。
第三步:执行 $model->validate();此时 errors 才会真实填充。
方法二:手动赋值(适合字段少或需强控)
先用 $data = \yii\helpers\Json::decode(Yii::$app->request->getRawBody()) 获取原始数据,再调用 $model->setAttributes($data, false);【false 表示跳过安全过滤,务必确保字段已白名单校验】。
验证失败时统一返回 JSON 响应
在控制器 action 顶部第一行写:
\Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
然后根据验证结果 return 数组即可,例如:
验证失败时:return ['success' => false, 'errors' => $model->errors];
验证成功时:return ['success' => true, 'data' => $model->attributes];
这一步不做,响应头仍是 text/html,前端 fetch().json() 会直接抛 parsererror 异常。










