['password', 'required', 'on' => 'create'],
['password', 'string', 'min' => 6],
['password', 'check'],
上面是rules()里面的规则, password字段不是数据库自带的,我添加进去的. 按理来说第三行check方法会在所有场景下都验证,但为什么只在create时候执行, update时跳过了呢?
而且我在调用之前也设置了 $model->scenario = 'update';
scenarios()也设置了
public function scenarios()
{
$scenarios = parent::scenarios();
$scenarios['update'] = ['username', 'email', 'status'];
return $scenarios;
}
附上一段代码,是在insert/update之前调用的validate函数,如下;注意其中的
这里的activeAttributes是当前的scenario所包含的属性,即 [‘username’, ’email’, ‘status’],接下来的校验之针对这几个属性做教研,不会针对password做校验。
其中 $validator->validateAttributes($this, $attributeNames);
是获取当前scneriao的所有validator,然后利用这些validator对scenario包含的属性进行校验;根据你的设置,当前的validator是包含['password','check']
的,但是validator检验属性的时候是要检验validator指定的属性(password)和scnario属性(email,username…)的交集;所以实际上该validator啥也没做。
修改一下update需要检验的属性就可以了:$scenarios[‘update’] = [‘username’, ’email’, ‘status’,’password’];这样update场景下会执行pssword check和min validator
假如
scenarios 沒有設置
你的寫法會讓所有的欄位被驗證
但你
override scenarios 的方法, 也設置了情境如下
$scenarios[‘update’] = [‘username’, ’email’, ‘status’]; // 當你情境為 update 時, 指驗證後方指定的欄位
你後方尚未加入 password 所以會跳過阿~~~
按你现在的配置,只是在create时才是必须的呀,别的场景下略过也不算错误吧。