Yii中validator之scenario

  Yii中有个场景的概念,我们用到场景的地方主要是在model中定义rules规则的时候,可以对不同的场景使用不同的校验规则,所以,自然而然会认为所谓的场景就是对应的action的名字。其实场景和action的名字是不同的概念来的,不能混为一谈。scenario则是M的一种属性,理论上,scenario是独立于action概念的,可以在没有action的场合下使用scenario。model的scenario是通过设置它的scenario属性设置的,它和使用model的action没有任何关系。

比如:

$model=new User;
$model->scenario = 'create';


$model=new User('create');

都是设置了执行一个action的时候对model进行校验的场景

public function rules()
	{
		// NOTE: you should only define rules for those attributes that
		// will receive user inputs.
		return array(
			array('username, email', 'required'),
			array('password, confirm_password', 'required', 'on'=>'create'),
			array('username', 'unique'),
			array('username, email', 'length', 'max'=>50),
			array('password, confirm_password', 'length', 'min'=>6, 'max'=>32),
			array('email', 'email'),
			array('confirm_password', 'compare', 'compareAttribute'=>'password', 'on'=>'create,update')
          ); }

上面的校验规则说明了初始密码和确认密码在create场景中是required的,和密码确认的compare是在create和update场景中都必须校验的。主要在action中对默认制定了对应的场景属性,在提交表单做校验的时候就能达到rules中定义的规则了。

 

下面是引用yii官方论坛帖子中牛人关于场景的解释:

场景的概念来自 用例驱动的方法学

用银行操作来说 存款 取款 转账 就是用例(关于用例的概念自己查阅相关资料或者google 简单点说就是里程碑式的操作 是系统级的方法
可以认为是应用级别的事务) 在面向对象中 模型层的东西会参加多个用例(一个对象有若干个方法 并不是所有方法在一次操作中都被用到
某个用例操作中只会用到一个或几个) 你可以这样认为用例等价场景 还有就是一个用例中可能不止一个模型参与其中

对AR来说 其中的若干属性只会参与一个用例(插入insert 更新update 或者搜索search) 在某种高度对象的方法和属性是一个级别概念 所以某些属性/方法 可以用用例来归组 经常在一起使用的方法或属性可以归为一个用例(场景)之中

用例可以自己定义 根据应用特征  比如User 这个模型类 在登陆操作(场景/用例/应用事务)中只会用到用户名和密码
所有这两个组合可以归为一个场景 其他属性根据业务可以自定义归组 ;  在拿改密码来说你可能需要用户输入旧密码 和新密码
那么这两个就会归属同一个用例(可以随意起名 比如changePassword等)

场景名不是yii定死的 但insert update 和search 是默认的(惯例而已) 在actionCreate actionUpdate
actionAdmin中出现的$model 默认的scenario 就分别是insert,update,search 你可以打印出来
echo $model->scenario ;die(); //在render 之前 试着调试输出;

地址:http://www.yiiframework.com/forum/index.php/topic/34947-%E5%AF%B9%E5%9C%BA%E6%99%AF%E7%9A%84%E6%A6%82%E5%BF%B5%E8%BF%98%E6%98%AF%E4%B8%8D%E6%98%8E%E7%99%BD%EF%BC%8C%E8%AF%B7%E9%AB%98%E6%89%8B%E8%A7%A3%E6%9E%90%E4%B8%80%E4%BA%8C/

看了这个解释肯定是豁然开朗了!

 

原文地址:https://www.cnblogs.com/springdong/p/3060457.html