Yii2中验证失败返回JSON需设Response::FORMAT_JSON并返回数组,框架自动序列化;AJAX请求可在beforeAction统一设format;ActiveForm校验用ActiveForm::validate()直接返回。

Yii2 中用 $model->validate() 验证失败后,错误信息默认是 PHP 数组格式,要转成标准 JSON 响应,关键不是手动拼字符串,而是让框架自动序列化并带上正确状态码。
验证失败时直接返回 JSON 结构
在控制器中调用 validate 后,检查是否出错,然后用数组返回,Yii2 会自动按当前 response format 序列化:
- 确保控制器 action 返回的是数组(不是 echo 或 die),例如:
if (!$model->validate()) {<br> return ['code' => 400, 'message' => '参数错误', 'errors' => $model->getErrors()];<br>} - 这个数组会被自动转成 JSON,前提是
Yii::$app->response->format已设为Response::FORMAT_JSON - 别在返回前调用
json_encode(),否则会变成双重编码的字符串
配合 AJAX 请求自动设 JSON 格式
避免每个 action 都手动设 format,可在控制器基类或模块中统一处理:
- 重写
beforeAction()方法:public function beforeAction($action) {<br> if (Yii::$app->request->isAjax || strpos(Yii::$app->request->getContentType(), 'application/json') !== false) {<br> Yii::$app->response->format = Response::FORMAT_JSON;<br> }<br> return parent::beforeAction($action);<br>} - 这样所有 AJAX 或 JSON 请求都会走 JSON 响应流程,包括 validate 错误返回
表单验证场景:用 ActiveForm::validate()
如果是前端通过 ActiveForm 提交校验,服务端需适配其调用方式:
- 判断是否为 AJAX 请求:
if (Yii::$app->request->isAjax && $model->load(Yii::$app->request->post())) {<br> Yii::$app->response->format = Response::FORMAT_JSON;<br> return ActiveForm::validate($model);<br>} -
ActiveForm::validate()内部已组织好字段级错误结构,直接返回即可 - 注意:必须在 return 前设置 format,否则可能返回 HTML 或空响应
确保错误字段名与前端匹配
默认 $model->getErrors() 返回的是字段名为键的二维数组,如 ['username' => ['用户名不能为空']]。若前端期望扁平结构或自定义 key 名,可做简单映射:
$errors = [];<br>foreach ($model->getErrors() as $field => $msgs) {<br> $errors[$field] = reset($msgs); // 取第一条错误提示<br>}- 再把
$errors放进最终返回数组的'errors'字段里


















