关于模型Validation的Rules Scenario使用思考

参考:

http://www.yiiframework.com/wiki/266/understanding-scenarios/

http://www.yiiframework.com/wiki/56/reference-model-rules-validation/

http://php.refulz.com/yii-framework-scenarios-for-conditional-multiple-validation-rules/

规则列表写法格式:

虽然可以 多字段 同一个验证规则,多个场景。

array(‘field1,…,field20’, ‘required’, on=>‘insert,update,registration’);

但下面这种写法可读性更高些:

//所有场景

array(‘fiedl1,…field20’, ‘required’);//先定义required规则

array(‘fiedl1,…field20’, ‘email’);//其他规则

//…

//特定场景insert

array(‘field1,…,’, ‘required’, ‘on’=>‘insert’);//再定义场景的required规则

array(‘field1,…,’, ’ yourValidator’, ‘on’=>‘insert’);//再定义场景的其他规则

//特定场景update

array(‘field1,…,’, ‘required’, ‘on’=>‘update’);//再定义场景的required规则

array(‘field1,…,’, ’ yourValidator’, ‘on’=>’ update’);//再定义场景的其他规则

//…

//特定场景search

array(‘field1,…,’, ‘required’, ‘on’=>‘search’);//再定义场景的required规则

array(‘field1,…,’, ‘yourValidator’, ‘on’=>’ search’);//再定义场景的其他规则

//…

场景的命名:

在一些复杂的应用中,数据入库方式有多种,比如:

Web注册 r=user/registrion/reginstrion、

Web注册后向导 r=user/guide/step1、

Web资料完善 r=user/profile/profile、

App注册 r=api/registrion/reginstrion、

App注册后向导 api/guide/step1、

App资料完善 api/profile/profile,

他们所需要的收集的信息和验证规则有所差异(一般来说 主要在必填字段的差异),那么默认的几个场景名称(在CAtiveRecord中有insert、update、search)就不太够用了,那么场景名称以Yii::app()->controller->route来定义吧?

关于场景的使用:

1.在实例化时即指定

$model = new User(‘changepwd’);

2.在实例化之后手工指定

$model = User::model()->findByPk($id);

$model->scenario = ‘changepwd’;

3.在验证时指定

//Case 1

$model1 = User::model()->findByPk($id)

//Case 2

$model2 = new User();

$model1->validate(‘changepwd’);

$model2->validate(‘changepwd’);

关于验证规则的动态调整:

1.添加规则:

$validator = new CNumberValidator;

$validator->attributes = array(‘id’);

$validator->integerOnly = true;

$model->validatorList->add($validator);

等同于

array(‘id’, ‘numerical’, ‘integerOnly’ => true),

2.删除规则????由于基于CList,貌似不好删改~~~~