Wednesday, October 10, 2018

Yii2 Sconarios 作用


二、场景


1、场景说的通俗点,就是不同条件下环境。举个用户注册的例子,普通用户在注册的时候只要用户名、密码、电子邮箱就可以了, 而企业用户除了这些外还需要提供企业名称、法人名称、营业执照号什么的,这就是两个不同的场景。 为了让一个模型能使用在不同的场景下面,Yii里面提供了scenarios()方法,返回的也是name-value数组, name为每个不同 的场景,value是一个数组,为对应场景的所用到的属性。

public function scenarios()
{
    return [
        'login' => ['username', 'password'],
        'register' => ['username', 'email', 'password'],
    ];
}
如上所示,用户模型里面有 username,password,email三个属性,在登录的场景下只需要username和password,而在注册的场景中还需要email。 如果没有在模型中定义场景scenarios(),那么将会使用默认的场景,即所有的属性都将使用。 

2、如果在定义场景的同时还要保持默认的场景可用,那么就得需要调用父类的scenarios()

public function scenarios()
{
    $scenarios = parent::scenarios();
    $scenarios['login'] = ['username', 'password'];
    $scenarios['register'] = ['username', 'email', 'password'];
    return $scenarios;
}
3、有时候我们在批量赋值的时候需要标明某些属性是不安全的,但又想让让这些属性能够正常的验证。 我们可以在场景scenarios()中的那些属性前面加上感叹号前缀,如

['username', 'password', '!secret']
username, password 和secret都能被验证,但在给属性批量赋值的时候只有username和password被认识是安全的可以赋值,而secret就不能被赋值 4、条件验证 可以在满员某些条件的情况下才验证属性,例如一个属性的验证需要另外一个属性值(确认密码等),这个时候可以用when关键字来定义

['state', 'required', 'when' => function($model) { return $model->country == Country::USA; }],
['stateOthers', 'required', 'when' => function($model) { return $model->country != Country::USA; }],
['mother', 'required', 'when' => function($model) { return $model->age < 18 && $model->married != true; }],
如果需要在客户端进行逻辑验证(enableClientValidation is true),得需要使用关键字 whenClient

['state', 'required', 'when' => $usa['server-side'], 'whenClient' => $usa['client-side']]

No comments: