yii2中activerecord验证失败返回json需两步:先调用validate()或save()并检查错误,再设置response格式为json并返回['success'=>false,'errors'=>$model->errors]结构。

Yii2 中 ActiveRecord 验证失败后输出 JSON,关键在于两点:一是让验证逻辑在请求中正确触发并捕获错误,二是把错误信息以 JSON 格式返回,且格式清晰、可被前端直接解析。
验证失败时返回标准 JSON 错误结构
默认情况下,$model->validate() 只返回布尔值,错误存在 $model->errors 中。要输出 JSON,需手动构造响应:
- 先调用
$model->validate()或$model->save()(后者内部会 validate) - 检查
if (!$model->hasErrors()),否则提取错误数组 - 设置响应格式:
\Yii::$app->response->format = \yii\web\Response::FORMAT_JSON; - 返回统一结构,例如:
['success' => false, 'errors' => $model->errors]
AJAX 表单提交时的实时验证响应
前端用 ActiveForm 提交时,常需异步验证(如用户名唯一性)。Yii2 提供了现成支持:
- 在控制器 action 中判断
Yii::$app->request->isAjax - 调用
\yii\bootstrap\ActiveForm::validate($model, ['field1', 'field2']) - 该方法直接返回已格式化的错误数组,形如
['username' => ['用户名已被占用']] - 无需手动设 format,它内部已处理为 JSON 响应
确保中文不乱码与空响应防护
直接 return $model->errors 可能导致中文显示为 Unicode(如 \u4f60\u597d),或循环引用时报空响应:
- 在
config/web.php的response组件中配置:'formatters' => ['json' => ['encodeOptions' => JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES]] - 避免直接返回含 DateTime、资源或闭包的模型属性;验证前可用
array_filter($model->errors)清理空项 - 加简单兜底:
if (empty($model->errors)) { return ['success' => true]; }
完整示例:控制器中处理保存并返回 JSON 错误
(适用于 API 场景或前后端分离项目)
\Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;-
if ($model->load(Yii::$app->request->post()) && $model->save()) {
return ['success' => true, 'id' => $model->id]; -
} else {
return ['success' => false, 'errors' => $model->errors]; }











