yii2表单验证失败时,$model->errors是二维数组,可直接json_encode输出;也可用array_map取每字段首错、foreach扁平化为字符串列表,或结合getattributelabel生成带标签的详细错误。

在 Yii2 中,表单验证失败后,模型的 $model->errors 是一个二维数组,结构为 ['attribute' => ['error message 1', 'error message 2']]。要将其转为标准 JSON 格式(如前端统一处理),关键在于扁平化错误、保留字段名和消息,并确保 JSON 合法。
直接使用 getErrors() 转 JSON(基础方式)
Yii2 模型自带 getErrors() 方法,返回完整错误数组。可直接用 json_encode 输出:
$model = new LoginForm();
if ($model->load(Yii::$app->request->post()) && !$model->validate()) {
\Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
return ['success' => false, 'errors' => $model->errors];
}
输出示例:
{
"username": ["用户名不能为空。", "用户名长度不能小于 2。"],
"password": ["密码不能为空。"]
}
提取单条错误(只取每个字段第一条)
前端常只需每字段一个提示,避免冗余。可用 array_map 简化:
$flatErrors = array_map(function($msgs) {
return reset($msgs); // 取第一个错误消息
}, $model->errors);
return ['success' => false, 'errors' => $flatErrors];
结果示例:
{
"username": "用户名不能为空。",
"password": "密码不能为空。"
}
合并所有错误为字符串列表(适合全局提示)
若需在顶部显示汇总错误(如 Toast 提示),可扁平化为一维字符串数组:
$allErrors = [];
foreach ($model->errors as $attribute => $messages) {
foreach ($messages as $message) {
$allErrors[] = $message;
}
}
return ['success' => false, 'errors' => $allErrors];
输出示例:
["用户名不能为空。", "用户名长度不能小于 2。", "密码不能为空。"]
自定义错误格式(含字段标签和规则类型)
若需更丰富信息(如显示“用户名”而非 “username”,或标注是 required 还是 string 规则),可遍历 getFirstErrors() 或结合 getAttributeLabel():
$detailedErrors = [];
foreach ($model->errors as $attribute => $messages) {
$label = $model->getAttributeLabel($attribute);
foreach ($messages as $msg) {
$detailedErrors[] = [
'field' => $attribute,
'label' => $label,
'message' => $msg
];
}
}
return ['success' => false, 'errors' => $detailedErrors];











