yii2复用参数验证逻辑的核心是封装可复用验证组件:自定义validator类、参数化内置规则、traits统一注入、运行时createvalidator。

Yii2 中复用参数验证逻辑,核心是把验证规则封装成可复用的组件,而不是在每个 Model 或场景里重复写相同的 rules() 配置。关键在于:自定义验证器 + 属性级复用 + 场景适配。
封装为独立验证器类
把通用校验逻辑(如手机号格式、身份证号、密码强度)抽成继承 yii\validators\Validator 的类,支持配置参数,便于跨模型复用:
- 在
common/validators/下新建MobileValidator.php - 重写
validateAttribute(),用正则或业务逻辑判断 - 通过
$this->message和$this->when支持自定义提示和条件触发 - 在 Model 的
rules()中直接引用:['mobile', MobileValidator::class, 'country' => 'CN']
在 rules() 中复用内置规则+自定义参数
Yii2 内置规则(如 string、in、date)本身支持参数化,配合 on 和 except 可按场景复用:
- 同一字段在多个场景下需相同长度限制:
['username', 'string', 'min' => 3, 'max' => 20, 'on' => ['register', 'edit']] - 复用带默认错误信息的规则组,避免每处写
'message' => 'xxx' - 结合
skipOnEmpty或skipOnError控制链式验证时机
使用 traits 统一注入验证规则
对具有共性字段的多个 Model(如都含 status、created_at),可用 trait 封装 rules() 片段:
- 定义
StatusRuleTrait.php,提供getStatusRules()方法返回规则数组 - Model 中合并规则:
return array_merge(parent::rules(), $this->getStatusRules()); - trait 内可调用自定义验证器,实现“规则组合复用”
通过 Validator::createValidator 复用验证逻辑(运行时)
在控制器或服务层需要临时校验数据(非 Model 场景),可直接创建验证器实例:
$validator = \yii\validators\RequiredValidator::createValidator();-
$validator->validate($value, $error);返回布尔值,$error存错误信息 - 适合 API 参数预检、表单提交前 JS 后的二次校验等轻量复用场景











