Yii2 API参数验证应使用ParamValidatorFilter过滤器统一拦截,在beforeAction中按action ID配置规则校验必填、类型、正则等,严格模式控制非法字段,错误返回标准ApiResponse格式,并与模型rules分层协作。

Yii2 API 接口自定义参数验证,关键不在“写多少代码”,而在于“在哪验、怎么验、错怎么报”。直接在 action 里 if-else 判参数,容易重复、难维护、异常格式不统一。推荐用过滤器(Filter)集中拦截,配合清晰规则配置和结构化错误返回。
用 ParamValidatorFilter 统一拦截参数
把验证逻辑抽成独立过滤器,所有需要校验的接口行为自动触发,无需每个 action 手动调用。核心是继承 ActionFilter,重写 beforeAction(),在请求进入业务逻辑前完成检查。
- 规则按 action ID 配置,例如
['login' => ['username' => ['required' => true, 'type' => 'string'], 'age' => ['type' => 'integer', 'min' => 18]]] - 支持必填、类型(string/int/float/bool)、正则、枚举值(
in)、数值范围(min/max)等基础校验 - 错误信息数组格式为
['field' => ['提示1', '提示2']],方便前端精准定位问题字段
严格模式与宽松模式灵活切换
通过 $strict = true 控制是否强制只允许声明的参数出现。开启后,客户端多传一个未定义字段(如 debug=1),直接报错;关闭则仅校验已声明字段,忽略多余参数——适合灰度期或兼容旧版场景。
- 生产环境建议开启严格模式,防止非法字段干扰业务逻辑
- 调试阶段可临时关闭,配合日志记录未知参数,辅助接口演进分析
- 注意:空字符串
''和null在get()/post()中表现不同,统一用$request->getBodyParams()+$request->getQueryParams()合并更稳妥
错误响应格式必须统一且可读
别用裸 throw new BadRequestHttpException(json_encode(...))。应封装为标准 ApiResponse 类,确保所有接口返回结构一致,比如:
{"code": 400, "message": "参数错误", "data": {"username": ["用户名不能为空", "用户名长度不能超过20"]}}- HTTP 状态码保持语义正确(400 表参数错,401 表认证失败,403 表权限不足)
- 中文错误信息需加
JSON_UNESCAPED_UNICODE,避免前端显示 \uXXXX
与模型验证协同使用,不互相替代
过滤器负责“接口层”校验(是否存在、类型对不对、格式合不合),模型 rules 负责“业务层”校验(唯一性、关联存在性、业务规则如“密码不能等于用户名”)。两者分工明确:
- 过滤器先拦住明显非法请求(如传了字符串 age),减少无效 DB 查询
- 模型 save() 前再走一遍 rules,确保数据入库前符合全部约束
- 例如注册接口:过滤器校验 phone 是否为合法手机号格式;User::rules() 再查该手机号是否已被注册


















