关键是要让成功和失败都走统一、可预测的 json 路径:验证失败时返回 code:400 + errors;成功时返回 code:0 + data;全程强制设置 response format 为 json,并统一错误处理机制。

Yii2 表单验证后返回 JSON,关键不是“怎么返回”,而是“怎么让成功和失败都走统一、可预测的 JSON 路径”,避免前端收到 HTML 错误页、空响应或状态码错乱。
验证失败时返回结构化 JSON 错误
默认情况下,validate() 失败只把错误塞进模型的 $model->errors,但不会自动返回 JSON。你需要手动判断并组织响应:
- 调用
$model->load($request->post())或$model->load($data, '')(JSON 场景下先解析好数据) - 执行
$model->validate() - 失败时:直接
return ['code' => 400, 'message' => '验证失败', 'errors' => $model->errors] - 注意:此时必须已设置
Yii::$app->response->format = \yii\web\Response::FORMAT_JSON,否则返回的是带 HTML 包裹的字符串
验证成功时返回业务数据 + 统一状态码
成功不是“没报错就完事”,要明确告诉前端“操作完成”并附带结果:
Miller (mlr) 是一个命令行工具,用于查询、整形和重新格式化名称索引数据,如 CSV、TSV、JSON 和 JSON Lines。它将 awk、sed、cut、join 和 sort 的功能整合到一个专为结构化数据处理而构建的单一工具中。
- 验证通过后,继续执行保存、计算等逻辑
- 成功返回示例:
return ['code' => 0, 'message' => '提交成功', 'data' => $model->attributes] - 不要用
200作为业务成功码——它只是 HTTP 状态码;code: 0是前端约定的业务层成功标识 - 若需返回新生成 ID 或 token,一并塞进
data字段,别额外写字段名
确保整个流程不混入 HTML 或空响应
常见断点不在验证逻辑本身,而在响应生命周期管理:
- 控制器 action 开头第一行就设
Yii::$app->response->format = \yii\web\Response::FORMAT_JSON - 禁止在 return 前使用
echo、var_dump、exit,否则 headers 已发送,JSON 格式失效 - 如果用了
beforeAction(),别在里面修改 response format 后忘记还原,尤其混合 HTML/JSON 接口时 - 检查 Network 面板中 Response Headers 是否含
Content-Type: application/json; charset=UTF-8
错误场景也要走同一套 JSON 返回
表单验证失败是业务错误,但服务器异常(如数据库挂了)、参数缺失、CSRF 不对等也得保持格式一致:
- 在
config/web.php中配置'errorHandler' => ['errorAction' => 'site/error'] -
SiteController::actionError()里统一返回['code' => $exception->statusCode ?: 500, 'message' => $message] - 抛出异常时优先用
throw new \yii\web\BadRequestHttpException('字段xxx不能为空'),它会被自动映射为code: 400 - 自定义业务异常继承
\yii\base\UserException,避免触发 500 白屏










