zoukankan      html  css  js  c++  java
  • 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/

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

     

  • 相关阅读:
    信号
    13. 罗马数字转整数
    ES6基础-constructor与super
    关于antd-vue动态表单的问题以及解决方案
    (vue)关于在ui框架方法中传入多个参数的解决方案
    ts-4: 类型别名与interface
    ts-3:元组与类型约束
    TS-2:类型注释与类型推断、函数参数的定义与返回类型的定义、对象成员与数组成员的定义方法、类型别名与类别名
    LeetCode 141. 环形链表 | Python
    LeetCode 459. 重复的子字符串 | Python
  • 原文地址:https://www.cnblogs.com/springdong/p/3060457.html
Copyright © 2011-2022 走看看