Laravel唯一的电子邮件验证不适用于mongodb中的不同字符大小写

时间:2018-02-09 12:01:38

标签: php laravel-5 laravel-5.5

我有一个带有唯一电子邮件验证的注册表单。当我输入不同的字符大小写时,电子邮件不会应用唯一的验证。

example@gmail.com, Example@gmail.com, eXample@gmail.com:Laravel唯一验证失败。

example@gmail.com, example@gmail.com, example@gmail.com:Laravel独特的验证是成功的。

请检查下面的代码并纠正我。电子邮件在数据库中以小写形式存储。

DB - Mongodb,

框架 - Laravel 5.5

jenssegers/laravel-mongodb is using to connect laravel and mongodb

RegisterController.php

protected function validator(array $data)
{
  return Validator::make($data, [
     'firstName' => 'required|string|max:255',
     'lastName' => 'required|string|max:255',
     'email' => 'required|string|email|max:255|unique:user,usrEmail',
     'password' => 'required|string|min:6|confirmed',
  ]);
}

User.php (型号)

public function setusrEmailAttribute($value)
{
  $this->attributes['usrEmail'] = strtolower($value);
}

4 个答案:

答案 0 :(得分:3)

在laravel自定义验证规则的帮助下,我解决了这个问题。

我使用php artisan命令php artisan make:rule Lowercase创建一个新规则并定义了规则。

应用/规则/ Lowercase.php

public function passes($attribute, $value)
{
 return strtolower($value) === $value;
}

public function message()
{
    return 'The :attribute must be lowercase.';
}

我已将规则对象附加到其他规则

<强> RegisterController.php

use App\Rules\Lowercase;
protected function validator(array $data)
{
        return Validator::make($data, [
            'firstName' => 'required|string|max:255',
            'lastName' => 'required|string|max:255',
            'email' => [ 'required', 'string', 'email', 'max:255', 'unique:user,usrEmail', new Lowercase ],
            'password' => 'required|string|min:6|confirmed',
            'dataProtection' => 'required',
            'termsService' => 'required',
        ]);
}

注册用户输入电子邮件时,系统会提醒用户使用小写。

它对我有用我不确定这是一个好方法。

答案 1 :(得分:2)

我知道你已经关闭了这个,但我确实想提出两种可能的替代解决方案。

<强> Form Request Validation: After Hooks

对于这种方法,您可以创建一个自定义表单请求(就像您一样)并执行以下操作:

Maybe

在这里,您可以将电子邮件转换为小写,并将其与您的数据库进行比较。这样您就不必依赖用户重新输入电子邮件。如果电子邮件不是唯一的,您只需要返回错误的用户。简而言之,这允许您执行额外的验证。

<强> Middleware

第二种方式,可能不是正确的方式,将使用自定义中间件。我没有看到你不能设置这样的东西的理由:

maybe

使用中间件的好处是,您可以知道输入的电子邮件在验证之前是否是唯一的。有些事情需要考虑!

答案 2 :(得分:1)

您可以在验证前使用flatMap

<强> RegisterController.php

strtolower($data['email'])

答案 3 :(得分:0)

我有最简单的解决方案来解决Laravel MySql中唯一的电子邮件问题

只需使用以下查询使您的字段唯一:

ALTER TABLE `users` ADD UNIQUE(`email`);

这解决了我的区分大小写和唯一的问题,不需要在任何控制器和模型脚本中进行任何更改。感谢问这个问题。