yii模型验证规则配置决定校验逻辑生效、提示准确性和业务边界控制;需在rules()中正确定义属性、验证器、场景、条件等,否则导致关键校验被绕过。

在Yii框架中,模型验证规则配置直接影响数据入库前的校验逻辑是否生效、错误提示是否准确、以及业务边界是否被严格控制。不正确配置rules()方法会导致表单提交绕过关键校验,例如手机号格式未检查、必填字段被空值通过、敏感字段被非法修改等严重问题。
定义基础验证规则
在模型类中重写rules()方法,返回二维数组,每项代表一条验证规则。
每个子数组至少包含三个元素:待验证属性名(字符串或数组)、验证器名称(字符串)、验证场景(可选,如'on' => ['create'])。
['username', 'required', 'message' => '用户名不能为空'] 这条规则表示:当验证发生时,username字段必须存在且非空字符串、非null、非0、非false;若为空,抛出指定message提示。
验证器名称区分大小写,【required不是字符串字面量,而是内置验证器类名RequiredValidator的简写】,写成'required'即可,框架会自动映射。
组合多个属性共用同一规则
将多个属性名以数组形式传入规则第一项,可一次性为它们绑定相同验证逻辑。
['[name, email, phone]', 'string', 'max' => 50] 表示name、email、phone三个字段都需满足最大长度50字符限制。
注意此处使用方括号包裹字段名并用逗号分隔,是Yii特有的语法糖;写成['name', 'email', 'phone']会被视为三条独立规则,而非一条作用于多字段的规则。
按场景启用不同验证集
第一步:在rules()中为规则指定适用场景,例如 'on' => ['register'] 或 'on' => ['update']。
第二步:调用validate()时显式传入场景名,如 $model->validate(['register']);不传则默认使用'model'场景,仅匹配未声明on条件的规则。
第三步:确保控制器中调用save()时也指定场景,例如 $model->save(false) → $model->validate(['register']) → $model->save(),否则场景规则不会触发。
场景名必须完全一致,【大小写敏感且不能含空格】,register和Register被视为两个不同场景。
自定义验证方法规则
方法一:在rules()中声明内联验证器,如 ['password', 'validatePassword'],其中validatePassword是模型内的public function。
方法二:该函数接收两个参数:$attribute(当前验证字段名)和 $params(规则中定义的额外参数),内部用$this->addError($attribute, '错误提示') 添加错误。
方法三:若需访问其他字段值做联动校验(如确认密码是否一致),直接读取$this->password_repeat即可,无需额外传参。
注意:内联验证器函数名不能与内置验证器同名,否则会导致覆盖或不可预期行为。
设置验证时机与条件
'when'选项支持匿名函数,用于动态决定某条规则是否执行。例如 ['status', 'in', 'range' => [0,1], 'when' => function($model) { return $model->is_active == 1; }] 表示只有当is_active为1时,status才必须是0或1。
'skipOnEmpty'设为true时,若字段值为空(null/''/[]等),跳过该规则验证;设为false则强制执行,适合“空值也是一种有效状态”的业务,如允许用户主动清空备注字段但需校验格式。
'except'和'on'互斥,二者不能同时出现在同一条规则中。











