Yii2 rules规则unique不起作用解决
yii2的一个强大之处之一就是他的Form组件,既方便又安全。具体的rules使用方法这里就不提了, 如果你的一般验证规则,如require email captcha等可用,而unique却不起作用,可以朝下看.已经过实验,没有问题
我这里用的是高级模板,普通模板没用过,应该差不多, 在yii2首次安装之后,common/models/User.php就有username和email的unique规则,因为我前后台分离,所以将User.php分别在frontend和backend复制了一份,删除了common下的User.php,规则如下:
使用原来的验证代码,这里非ajax提交,require和email等都是可用的, 唯有unique不行, 先看原来的注册代码:frontend/models/User.php中
我这里用的是高级模板,普通模板没用过,应该差不多, 在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,
]);
}
}
实在是想不出这两处写法有什么不一样,不过问题是解决了