Yii2-具有自定义功能的独特电子邮件

Yii2-具有自定义功能的独特电子邮件,yii,yii2,Yii,Yii2,在规则方法中,我有以下电子邮件规则: ['email', 'uniqueEmail'], ['email', 'email'], 和UniqueMail方法: public function uniqueEmail($attribute, $email) { $user = static::findOne(['email' => Yii::$app->encrypter->encrypt($email)]); if (count($us

规则方法中,我有以下电子邮件规则:

['email', 'uniqueEmail'],
['email', 'email'],
和UniqueMail方法:

public function uniqueEmail($attribute, $email)
    {
        $user = static::findOne(['email' => Yii::$app->encrypter->encrypt($email)]);
        if (count($user) > 0)
            $this->addError($attribute, 'This email is already in use".');
    }

电子邮件验证正在工作,但UniqueMail不工作。我怎样才能做到这一点呢?

为什么您认为
$email
中包含该值?如文档所述,第二个函数param实际上是参数数组,在验证器声明末尾提供(
['email','uniqueemail','param1'=>'value1','param2','value2'])

试试这个:

public function uniqueEmail($attribute) {
    $user = static::findOne(['email' => Yii::$app->encrypter->encrypt($this->{$attribute})]);
    if ($user) { // dont use count($user) - if it's there, it's a single object, you want to check if it's not null!
        $this->addError($attribute, 'This email is already in use".');
    }
}
Yii2
中,可以将即席验证声明为匿名函数:

['email', function($attribute) {
    $user = static::findOne(['email' => Yii::$app->encrypter->encrypt($this->{$attribute})]);
    if ($user) {
        $this->addError($attribute, 'This email is already in use".');
    }
}],
['email', 'email'],

尝试了您的代码(第二种方法),但验证仍然不起作用:/@Sasha请告诉我“不起作用”是什么意思。在该表中,您是否有一条记录,其中包含值与您查找的加密电子邮件相同的
email
字段?如果您有任何错误,是否可以进行
var\u转储($user);在验证器中退出
?我刚刚解决了一个明显的问题,我猜不出你的数据库是如何建模的,也猜不出你的应用程序是如何工作的。我必须纠正我自己-js部分不起作用(现场验证,不发布表单),但一旦表单发布,验证就起作用了。只有在提交表单时才运行定义验证!这就是它所做的-它验证提交的表单。您不应该期望它在未提交任何内容的情况下运行。如果您想要客户端验证,您必须阅读本文: