Yii2中模型验证失败时应先调用validate(),再用getErrors()获取错误并格式化为JSON返回;推荐按字段取首条错误组装为键值对,兼顾语义与简洁。

在 Yii2 中,当模型验证失败时,通常需要将错误信息以 JSON 格式返回给前端(如 AJAX 请求),便于统一处理提示。关键在于把 $model->getErrors() 的二维数组结构转换为更易读、扁平或语义清晰的 JSON 响应。
获取并格式化验证错误
Yii2 的 $model->getErrors() 返回形如:
['username' => ['用户名不能为空', '用户名长度不能超过 20 位'], 'email' => ['邮箱格式不正确']]
这种结构对前端解析不够友好,建议转为键值一一对应或带字段名的错误列表。
常用组装方式:
- 直接返回原始错误数组(适合后端约定明确、前端能处理嵌套结构):
return $this->asJson(['success' => false, 'errors' => $model->getErrors()]); - 扁平化为一维错误消息数组(适合全局提示):
$flatErrors = array_merge(...array_values($model->getErrors()));<br> return $this->asJson(['success' => false, 'errors' => $flatErrors]);
- 按字段组装为对象,每个字段只取第一条错误(推荐,兼顾语义与简洁):
$errors = [];<br> foreach ($model->getErrors() as $attribute => $msgs) {<br> $errors[$attribute] = $msgs[0]; // 取首个错误提示<br> }<br> return $this->asJson(['success' => false, 'errors' => $errors]);
在控制器中统一响应封装
为避免重复代码,可在 BaseController 或行为中定义响应方法:
protected function responseValidationError($model) {<br>
$errors = [];<br>
foreach ($model->getErrors() as $attr => $msgs) {<br>
$errors[Inflector::camel2words($attr, true)] = $msgs[0]; // 自动转“user_name” → “User name”<br>
}<br>
return $this->asJson(['success' => false, 'code' => 422, 'message' => '验证失败', 'errors' => $errors]);<br>
}
调用:if (!$model->validate()) { return $this->responseValidationError($model); }
注意点与常见问题
- 确保控制器已启用 JSON 响应:
public function behaviors() { return ['contentNegotiator' => ['class' => ContentNegotiator::className(), 'formats' => ['application/json' => Response::FORMAT_JSON]];} - 若使用
ActiveForm+ AJAX 验证,默认已支持getErrors()结构,无需额外转换 - 中文字段名建议在 Model 中重写
attributeLabels(),并在错误组装时用$model->getAttributeLabel($attr)替代字段名,提升可读性 - 不要直接返回
$model->errors(未触发验证),务必先调用$model->validate()或$model->save()


















