【问题标题】:Validation rules conflict on model scenarios yii模型场景的验证规则冲突 yii
【发布时间】:2017-09-02 18:36:44
【问题描述】:

我的模型验证规则如下

public function rules()
{
    // NOTE: you should only define rules for those attributes that
    // will receive user inputs.
    //post of step 1
    if (isset($_POST['yt0']))
    {
        return array(
                array('EmailAddress,', 'required','message' =>  Yii::t('message', 'USERNAME_REQUIRED')),
                array('Password,', 'required','message' =>  Yii::t('message', 'PASSWORD_REQUIRED')),
                array('confirmPassword,', 'required','message' => Yii::t('message', 'CONFIRM_PASSWORD_REQUIRED')),
                array('Password','length', 'max' => 100, 'min' => 6, 'tooShort' => Yii::t('message', 'PASSWORD_LENGTH')),
                array('confirmPassword', 'compare', 'compareAttribute'=>'Password','message' => Yii::t('message', 'PASSWORD_COMPARE')),
                array('EmailId,', 'required','message' => Yii::t('message', 'EMAILID_REQUIRED')),
                array('EmailId','email','message'=>Yii::t('message', 'EMAILID_VALID')),
                array('chapterCode,', 'required','message' => Yii::t('message', 'CHAPTERCODE_REQUIRED')),
                array('verifyCode,', 'required','message' =>Yii::t('message', 'VERIFYCODE_REQUIRED')),
                array('verifyCode', 'captcha', 'allowEmpty'=>!CCaptcha::checkRequirements(),'caseSensitive'=>true,'message' =>Yii::t('message', 'VERIFYCODE_INCORRECT') ),
                array('EmailAddress', 'unique','className'=>'User','attributeName'=>'EmailAddress','message'=>Yii::t('message', 'EMAILID_UNIQUE')),
                array('PersonId', 'unique','className'=>'User','attributeName'=>'PersonId','message'=>"Person already exists."),
                array('FailedLoginCount', 'safe'),
        );
    }   elseif (isset($_POST['yt1']))
    {
        return array(
                array('EmailAddress,', 'required','message' => Yii::t('message', 'USERNAME_REQUIRED')),
                array('Password,', 'required','message' =>  Yii::t('message', 'PASSWORD_REQUIRED')),
                array('FailedLoginCount', 'safe'),

        );
    }elseif (isset($_POST['savecontact'])||$this->memBelongsto==0)
    {
        return array(
                array('EmailAddress,', 'required','message' => Yii::t('message', 'USERNAME_REQUIRED')),
                array('Password,', 'required','message' =>  Yii::t('message', 'PASSWORD_REQUIRED')),
                array('confirmPassword', 'required','message' => Yii::t('message', 'CONFIRM_PASSWORD_REQUIRED')),
                array('Password','length', 'max' => 100, 'min' => 6,'tooShort' => Yii::t('message', 'PASSWORD_LENGTH')),
                array('confirmPassword', 'compare', 'compareAttribute'=>'Password','message' => Yii::t('message', 'PASSWORD_COMPARE')),
                array('EmailId,', 'required','message' => Yii::t('message', 'EMAILID_REQUIRED'),'except'=>'datavalid'),
                array('EmailId','email','message'=>Yii::t('message', 'EMAILID_VALID'),'except'=>'datavalid'),
                array('FailedLoginCount', 'safe'),

        );
    }else{
        return array(
                array('EmailAddress,EmailId, Password', 'required'),
                array('PersonId, ActiveFlag, FailedLoginCount', 'numerical', 'integerOnly'=>true),
                array('EmailAddress, Password', 'length', 'max'=>100),
                array('confirmPassword,', 'required','message' => Yii::t('message', 'PASSWORD_REQUIRED')),
                array('Password','length', 'max' => 100, 'min' => 6, 'tooShort' => Yii::t('message', 'PASSWORD_LENGTH')),
                array('confirmPassword', 'compare', 'compareAttribute'=>'Password','message' => Yii::t('message', 'PASSWORD_COMPARE')),
                array('chapterCode,', 'required','message' => Yii::t('message', 'CHAPTERCODE_REQUIRED')),
                array('verifyCode,', 'required','message' =>Yii::t('message', 'VERIFYCODE_REQUIRED')),
                array('verifyCode', 'captcha', 'allowEmpty'=>!CCaptcha::checkRequirements(),'caseSensitive'=>true,'message' =>Yii::t('message', 'VERIFYCODE_INCORRECT')),
                array('FailedLoginCount', 'safe'),
        );
    }
}

这里yt0 是注册页面上提交按钮的名称,因此注册时将应用yt0 的规则,并且我有另一个用于更改密码的表单,所以在该页面上我只需要三个字段和提交按钮更改密码为savecontact,但应用了保存联系规则,但注册按钮规则冲突,因此注册验证不起作用。是否是正确的规则,如上述任何建议......

【问题讨论】:

    标签: php validation yii


    【解决方案1】:

    虽然这可能有效,但您的做法是错误的。 您应该使用scenario 来执行此类任务。

    首先,您可以为不同的表单声明场景:

    class User extends ActiveRecord
    {
        const SCENARIO_LOGIN = 'login';
        const SCENARIO_SIGNUP = 'signup';
        const SCENARIO_UPDATE = 'update';
    }
    

    当您完成定义场景后,您可以告诉您的模型使用哪些属性来进行大规模分配并针对特定场景应用验证。

    class User extends ActiveRecord
    {
        const SCENARIO_LOGIN = 'login';
        const SCENARIO_REGISTER = 'register';
        const SCENARIO_UPDATE = 'update';
    
        public function scenarios()
        {
            return [
                self::SCENARIO_LOGIN => ['username', 'password'],
                self::SCENARIO_REGISTER => ['email', 'username', 'password'],
                self::SCENARIO_UPDATE => ['email', 'username', 'password'],
            ];
        }
    }
    

    现在你已经完成了,你可以选择添加验证规则或者使用gii生成的默认规则。

    class User extends ActiveRecord
    {
        const SCENARIO_LOGIN = 'login';
        const SCENARIO_REGISTER = 'register';
        const SCENARIO_UPDATE = 'update';
    
        public function scenarios()
        {
            return [
                self::SCENARIO_LOGIN => ['username', 'password'],
                self::SCENARIO_REGISTER => ['email', 'username', 'password'],
                self::SCENARIO_UPDATE => ['email', 'username', 'password'],
            ];
        }
    
        public function rules()
        {
            return ArrayHelper::merge([
                ['email' => 'email', 'message' => Yii::t('message', 'wrong email format')],
                [['email', 'password', 'username'] => 'email'],
                ['username', 'exist', 'on' => self::SCENARIO_LOGIN], // this will apply only on login
                // other rules
            ], parent::rules());
        }
    }
    

    现在您已经完成了模型场景和规则,是时候正确使用它们了。

    前往您的控制器并使用场景实例化您的模型:

    public function actionLogin()
    {
        $model = new User(['scenario' => User::SCENARIO_LOGIN]);
    
        if($model->load(Yii::$app->request->post())) {
            // $model will have username and password even if email is in the form since it is using
            // User::SCENARIO_LOGIN
            $model->validate(); 
            // will validate only username and password even if email is in the form
            // will also use the username exist validator
            // do your stuff
        }
    }
    
    public function actionRegister()
    {
        $model = new User(['scenario' => User::SCENARIO_REGISTER]);
    
        if($model->load(Yii::$app->request->post())) {
            // $model will have username, password and email
            $model->validate(); 
            // will validate email, username and password but will not use the
            // username exist validation rule since it has the `'on' => self::SCENARIO_LOGIN`
            // do your stuff
        }
    }
    

    转至http://www.yiiframework.com/doc-2.0/guide-structure-models.html 了解有关如何正确使用模型和验证的更多详细信息

    【讨论】:

    • 感谢兄弟的回复,我会试试这个,如果有任何疑问,我会问
    猜你喜欢
    • 2013-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多