Yii2:scenario()模型方法

Boo*_*ype 3 php yii2 yii-validation

有2个需要的功能:注册时设置密码和更改密码,如果用户忘记了.用户注册时,密码长度必须至少为4个字符; 当变化通过时 - 至少5个字符.

视图通常用于注册和更改传递.显然,还存在2个动作,其中任一个场景'注册',或者使用'改变'.模型中的代码段:

public function rules() {
     return [
       ['password', 'string', 'min' => 4, 'on' => 'signup'],
       ['password', 'string', 'min' => 5, 'on' => 'change'],
     ];
}
Run Code Online (Sandbox Code Playgroud)

但我想通过scenario()做到这一点.怎么做?我是Yii的初学者,所以不明白,何时以及如何使用scenario().谢谢.

UPD.我需要使用场景()用于ONEONE规则,但是不同参数这一规律.如何在Yii2中定义场景? - 这不是我的情况.

Ton*_*ony 6

正如文档所述scenarios():此方法的默认实现将返回rules()声明中找到的所有方案.因此,通常您不需要覆盖此方法,因为它将查找on数组键以设置当前方案的活动属性并正确验证它们.

因此,在您的情况下'on' => 'some scenario',对同一属性的不同验证正是您所需要的.

  • 非常感谢!我想,我开始理解_on_和_scenario()_之间的差异.第一个使用,如果我们需要应用具体**规则**的场景:`['密码','必需','开'=>'注册''['密码','整数','开' =>'another_scenario']`和_scenario()_如果我们需要应用具体**属性的场景**:`public function scenarios(){$ scenarios = parent :: scenarios(); $ scenarios ['signin'] ='密码'; //当使用'signin'场景返回$ scenario时,所有规则都将应用于传递字段; 我的假设是对的吗? (2认同)
  • @Boolean_Type:绝对,这是正确的(虽然你做'$ scenario ['signin'] = ['password'];`,即使用在该场景中设置和验证的属性数组). (2认同)