根据官方文档来说,http://www.yiichina.com/doc/guide/2.0/input-validation#standalone-validators    需要对模型中定义规则的

rules方法指定使用范围,否者的话每一次调用保存都会调用这个方法

官方文档解释:

对于每个规则,你至少需要指定该规则适用于哪些特性,以及本规则的类型是什么。你可以指定以下的规则类型之一:

  • 核心验证器的昵称,比如 requiredindate,等等。请参考核心验证器章节查看完整的核心验证器列表。

  • 模型类中的某个验证方法的名称,或者一个匿名方法。请参考行内验证器小节了解更多。

  • 验证器类的名称。请参考独立验证器小节了解更多。

一个规则可用于验证一个或多个模型特性,且一个特性可以被一个或多个规则所验证。一个规则可以施用于特定场景(scenario),只要指定 on 选项。如果你不指定 on 选项,那么该规则会适配于所有场景。

当调用 validate() 方法时,它将运行以下几个具体的验证步骤:

  1. 检查从声明自 [[yii\base\Model::scenarios()]] 方法的场景中所挑选出的当前[[yii\base\Model::scenario|场景]]的信息,从而确定出那些特性需要被验证。这些特性被称为激活特性。

  2. 检查从声明自 [[yii\base\Model::rules()]] 方法的众多规则中所挑选出的适用于当前[[yii\base\Model::scenario|场景]]的规则,从而确定出需要验证哪些规则。这些规则被称为激活规则。

  3. 用每个激活规则去验证每个与之关联的激活特性。

基于以上验证步骤,有且仅有声明在 scenarios() 方法里的激活特性,且它还必须与一或多个声明自 rules() 里的激活规则相关联才会被验证。

比如:我们  后台用户类  中定义了rules

/**
     * 验证规则
     * @return string 返回验证信息
     */
    public function rules() {
         return [
            //填写用户名 密码 验证码 验证规则
            ['uname','required','message'=>'用户名不能为空'],
            ['upwd','required','message'=>'密码不能为空'],
            ['verifyCode','required','message'=>'验证码不能为空'],
            [
                'verifyCode', 'captcha',
                'captchaAction'=>'login/captcha',
                'message'=>'验证码不正确!'
            ],
 
        ];
    }

我们在登录的时候是对的,如果我们在编辑用户信息的时候,保存的话是不会成功的,因为在编辑状态下没有验证码所以是失败的

有两种方法:

方法一:

我们在编辑用户的控制器中,save方法添加一个参数 false 即:save(false)这样说明程序不运行规则验证也是可以的


方法二:

那么我们就需要进行如下的修正,指定一个ON, on指的是model而不是控制器

/**
     * 验证规则
     * @return string 返回验证信息
     */
    public function rules() {
         return [
            //填写用户名 密码 验证码 验证规则
            ['uname','required','message'=>'用户名不能为空',   'on'=>'login'],
            ['upwd','required','message'=>'密码不能为空',  'on'=>'login'],
            ['verifyCode','required','message'=>'验证码不能为空',  'on'=>'login'],
            [
                'verifyCode', 'captcha',
                'captchaAction'=>'login/captcha',
                'message'=>'验证码不正确!',
                         'on'=>'login'
            ],
 
        ];
    }

这样我们在后台编辑用户的时候就不会运行这个规则