yii2 restful api 表单验证失败时需重写 beforeaction 强制响应格式为 json,并配置 errorhandler 返回结构化 json 错误(如 {"name": ["name cannot be blank."]}),同时禁用布局、设置 content-type 头以避免 html 响应。

Yii2 RESTful API 中表单验证失败时默认返回 HTML 错误页,需手动配置才能统一返回 JSON 格式的错误信息。核心在于重写 beforeAction 和自定义 errorHandler,确保验证失败时响应体为标准 JSON 结构(如 {"name":["Name cannot be blank."]})。
启用 JSON 错误响应格式
在控制器基类(如 ActiveController 或自定义 RestController)中重写 beforeAction(),强制设置响应格式为 JSON:
- 调用
Yii::$app->response->format = Response::FORMAT_JSON; - 确保该设置在验证执行前生效(放在
parent::beforeAction($action)之前) - 若使用
yii\rest\ActiveController,建议继承它并覆盖beforeAction
统一处理模型验证错误
验证失败时,Yii 默认抛出 UnprocessableEntityHttpException(状态码 422)。需在 config/web.php 中配置 errorHandler,使其对 API 请求返回结构化 JSON:
- 设置
'errorAction' => 'site/error',并在SiteController::actionError()中判断是否为 AJAX/REST 请求 - 使用
Yii::$app->exception获取异常,若为ModelValidationException或验证失败的BadRequestHttpException,提取$model->errors - 手动构造响应:
return $this->asJson(['errors' => $model->errors]);
避免重复渲染与内容类型冲突
常见问题:验证失败后仍返回 HTML 页面或空响应。关键检查点:
- 确认控制器未在
actions()中覆盖'index'、'create'等动作的默认行为而遗漏验证逻辑 - 禁用布局(
$this->layout = false;)防止视图层注入 HTML 模板 - 显式设置响应头:
Yii::$app->response->headers->set('Content-Type', 'application/json; charset=UTF-8');
可选:封装通用验证响应方法
在基控制器中添加工具方法,简化各 action 的错误返回:
protected function sendValidationError($model) { return $this->asJson($model->errors); }- 在
actionCreate()等方法中,替换默认的throw new BadRequestHttpException(...)为return $this->sendValidationError($model); - 配合
if (!$model->validate()) { return $this->sendValidationError($model); }显式控制流程











