Yii2中Model::getErrors()需处理为干净扁平JSON:过滤空错误、统一字段结构、设置422状态码、支持i18n翻译。

在 Yii2 中,Model::getErrors() 返回的是一个二维关联数组,直接 JSON 编码后结构可能不符合前端预期(比如键名嵌套、空错误被保留、字段名大小写不统一等)。要输出「干净、扁平、可读性强」的 JSON 错误信息,需做针对性处理。
标准化错误格式:转为一维键值对
默认 getErrors() 返回类似:
{ "username": ["用户名不能为空"], "email": ["邮箱格式不正确"] }
这本身已是合法 JSON,但若希望所有错误合并为单层 message 列表,或按字段 + 提示组合成更明确结构,可手动映射:
- 用
array_merge(...array_values($model->getErrors()))合并所有错误消息为一维数组 - 用
foreach遍历getErrors(),构造["field" => "username", "message" => "用户名不能为空"]格式 - 推荐方式:返回带字段标识的扁平对象,便于前端精准定位错误位置
过滤空错误与隐藏字段
某些场景下模型验证后部分字段无错误,但 getErrors() 可能返回空数组(如 "password" => []),JSON 中保留这些空项会增加冗余。应主动过滤:
- 使用
array_filter($model->getErrors(), 'count')去掉空错误字段 - 若模型含敏感字段(如
password_hash),应在输出前用白名单或黑名单排除,避免意外暴露 - 注意:不要依赖
getSafeAttributeNames()过滤,它针对批量赋值,与错误无关
兼容 AJAX 响应:设置 Content-Type 并捕获异常
在控制器中返回错误 JSON 时,不仅要格式正确,还要确保 HTTP 头和状态码合理:
- 调用
Yii::$app->response->format = Response::FORMAT_JSON自动处理编码与头信息 - 搭配
Yii::$app->response->setStatusCode(422)(Unprocessable Entity)比 200 更语义化 - 避免直接
echo json_encode(...),否则可能因未关闭 layout 或其他输出导致 JSON 污染 - 完整示例:
$errors = array_filter($model->getErrors(), 'count');
return ['success' => false, 'errors' => $errors];
支持多语言与自定义提示
若项目启用 i18n,错误消息默认已翻译。但有时需强制指定语言,或替换默认提示:
- 在验证规则中使用
'message' => Yii::t('app', '请输入有效邮箱') - 全局切换语言:验证前执行
Yii::$app->language = 'zh-CN' - 运行时动态改写错误:遍历
getErrors(),对每个 message 调用Yii::t()二次翻译(适合模板化提示)


















