我有一个带有唯一电子邮件验证的注册表单。当我输入不同的字符大小写时,电子邮件不会应用唯一的验证。
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);
}
答案 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`);
这解决了我的区分大小写和唯一的问题,不需要在任何控制器和模型脚本中进行任何更改。感谢问这个问题。