Yii2 rules规则unique不起作用解决

时间: 2017-03-07  分类: Yii2  收藏
yii2的一个强大之处之一就是他的Form组件,既方便又安全。具体的rules使用方法这里就不提了, 如果你的一般验证规则,如require email captcha等可用,而unique却不起作用,可以朝下看.已经过实验,没有问题
我这里用的是高级模板,普通模板没用过,应该差不多, 在yii2首次安装之后,common/models/User.php就有username和email的unique规则,因为我前后台分离,所以将User.php分别在frontend和backend复制了一份,删除了common下的User.php,规则如下:
    /**
     * @inheritdoc
     */
    public function rules()
    {
        return [
            [['username','email'], 'trim'],
            [['username','email','password'], 'required'],
            ['username', 'unique', 'targetClass' => '\frontend\models\User', 'message' => '用户名已存在.'],
            ['username', 'string', 'min' => 5, 'max' => 255],

            ['email', 'email'],
            ['email', 'string', 'max' => 255],
            ['email', 'unique', 'targetClass' => '\frontend\models\User', 'message' => '邮箱已被注册.'],

            ['password', 'string', 'min' => 6, 'max' => 30],
            ['verifyCode', 'required','message'=>'验证码不能为空'],
            ['verifyCode', 'captcha','message'=>'验证码错误'],
        ];
    }

使用原来的验证代码,这里非ajax提交,require和email等都是可用的, 唯有unique不行, 先看原来的注册代码:frontend/models/User.php中
    public function signup() {
        //if (!$this->validate()) {     //此三行注释
            //return false;
        //}
        $user = new User();
        $user->username = $this->username;
        $user->email = $this->email;
        $user->setPassword($this->password);
        $user->generateAuthKey();

        return $user->save() ? $user : null;
    }
这里首句就是if (!$this->validate()) 没错误,但弄了好久,unique都不会在模板中提示,提交之后验证不通过,直接显示空白页面,后来将此三行验证注释,然后放到singup的控制器方法中,完美解决,可以在模板中直接提示,修改后控制器方法如下:
    public function actionSignup() {
        $model = new SignupForm();
        if ($model->load(Yii::$app->request->post()) && $model->validate()) { //validate放到这里完美解决
            if ($user = $model->signup()) {
                if (Yii::$app->getUser()->login($user)) {
                    return $this->goHome();
                }
            }
        } else {
            return $this->render('signup', [
                'model' => $model,
            ]);
        }
    }
实在是想不出这两处写法有什么不一样,不过问题是解决了
分享到:

评论

昵 称:
游客50010
先使用validate验证,再save,unique不起作用,如何解决问题,想在validate的基础验证之后,再save
05-25 17:47
游客27207
good
07-03 14:28