Yii2接口验证失败应返回{"success": false, "errors": {"field": ["msg"]}}格式JSON,成功时返回{"success": true, "data": {...}};需用$model->getErrors()获取标准错误数组,禁用非数组错误值,统一响应结构并设置JSON Content-Type。

Yii2 接口开发中,表单验证失败时返回结构清晰、符合前后端协作规范的 JSON 响应,是保证接口健壮性和调试效率的关键。默认情况下,Yii2 的 Model::validate() 只做校验不抛异常,需手动检查并组织错误数据。
验证失败时统一返回 errors 字段
推荐使用标准格式:{"success": false, "errors": {"field1": ["错误信息1"], "field2": ["错误信息2"]}}。避免只返回纯文本或嵌套过深的结构。
- 在控制器中调用
$model->load($request->getBodyParams()) && $model->validate() - 验证失败时,用
$model->getErrors()获取关联数组(字段名 → 错误消息数组) - 直接
return $this->asJson(['success' => false, 'errors' => $model->getErrors()])
确保错误消息为字符串数组(兼容前端遍历)
Yii2 默认的 getErrors() 返回格式已满足要求(每个字段对应一个字符串数组),但需注意自定义验证器中不要返回非数组值。
- 若手动添加错误,用
$model->addError('username', '用户名已被占用'),而非$model->addError('username', ['用户名已被占用']) - 避免在规则中写
['username', 'required', 'message' => '请输入用户名']以外的非常规 message 类型
成功时也保持响应结构一致
不要成功返回原始数据、失败返回 errors 对象——结构不一致会增加前端判断成本。
- 验证通过后,建议统一返回:
{"success": true, "data": {...}} - 即使无业务数据,也可返回空对象:
{"success": true, "data": []}或{"success": true} - 可封装一个通用响应方法,如
protected function response($success, $data = [], $errors = [])
补充:开启 strict JSON 模式(可选)
防止意外输出 HTML 或空白字符导致 JSON 解析失败:
- 在入口脚本
web/index.php中设置:header('Content-Type: application/json; charset=UTF-8'); - 或在控制器行为中统一配置:
'contentNegotiator' => ['formats' => ['application/json' => Response::FORMAT_JSON]] - 避免在验证逻辑前后 echo/print_r/var_dump 等调试输出


















