Php Laravel unique电子邮件验证无法在mongodb中处理不同的字符大小写

Php Laravel unique电子邮件验证无法在mongodb中处理不同的字符大小写,php,laravel-5,laravel-5.5,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 Register

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

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

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',
  ]);
}
public function passes($attribute, $value)
{
 return strtolower($value) === $value;
}

public function message()
{
    return 'The :attribute must be lowercase.';
}
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',
        ]);
}
protected function validator(array $data)
{
    $data['email'] = strtolower($data['email']);
    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(模型)


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

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

app/Rules/Lowercase.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',
  ]);
}
public function passes($attribute, $value)
{
 return strtolower($value) === $value;
}

public function message()
{
    return 'The :attribute must be lowercase.';
}
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',
        ]);
}
protected function validator(array $data)
{
    $data['email'] = strtolower($data['email']);
    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',
    ]);  
}
我已将规则对象附加到其他规则

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',
  ]);
}
public function passes($attribute, $value)
{
 return strtolower($value) === $value;
}

public function message()
{
    return 'The :attribute must be lowercase.';
}
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',
        ]);
}
protected function validator(array $data)
{
    $data['email'] = strtolower($data['email']);
    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',
    ]);  
}
注册用户输入电子邮件时,系统将提醒用户使用小写字母


我不确定这是不是一个好方法

在验证之前,您可以使用strtolower($data['email'])

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',
  ]);
}
public function passes($attribute, $value)
{
 return strtolower($value) === $value;
}

public function message()
{
    return 'The :attribute must be lowercase.';
}
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',
        ]);
}
protected function validator(array $data)
{
    $data['email'] = strtolower($data['email']);
    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',
    ]);  
}

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

对于这种方法,您将创建一个自定义表单请求(就像您所做的那样),并执行如下操作:

/**
 * Configure the validator instance.
 *
 * @param  \Illuminate\Validation\Validator  $validator
 * @return void
 */
public function withValidator($validator)
{
    $validator->after(function ($validator) {
        if ($this->somethingElseIsInvalid()) {
            $validator->errors()->add('field', 'Something is wrong with this field!');
        }
    });
}
<?php

namespace App\Http\Middleware;

use Closure;

class CheckEmail
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if ($this->someIsUniqueChecker($request->email)) {
            return redirect()->back()->withErrors($someErrors);
        }

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

第二种方法,可能不是正确的方法,是使用自定义中间件。我看不出你为什么不能设置这样的东西:

/**
 * Configure the validator instance.
 *
 * @param  \Illuminate\Validation\Validator  $validator
 * @return void
 */
public function withValidator($validator)
{
    $validator->after(function ($validator) {
        if ($this->somethingElseIsInvalid()) {
            $validator->errors()->add('field', 'Something is wrong with this field!');
        }
    });
}
<?php

namespace App\Http\Middleware;

use Closure;

class CheckEmail
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if ($this->someIsUniqueChecker($request->email)) {
            return redirect()->back()->withErrors($someErrors);
        }

        return $next($request);
    }
}

我有最简单的解决方案,可以在Laravel中修复MySql中唯一的电子邮件问题

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

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

这解决了我的大小写敏感和独特的问题,不需要在任何控制器和模型脚本中进行任何更改。感谢您提出这个问题。

请尝试仅使用
'email'=>“必需”| email |唯一:user,usrEmail',
@Pyton,Not working尝试将
$data['email']
转换为小写。可能这是区分大小写的问题。你有
用户
表还是
用户
表?@Pyton我已经应用了laravel功能变量,因此,当用户注册电子邮件时,将存储为小写。我不认为要求用户将其电子邮件设置为小写有什么意义。。但是,我们可能会在客户端js中自动执行此操作。这正是我所需要的。非常感谢。通过这种方式,它可以在用户将其帐户输入系统之前强制执行。这样用户就知道会发生什么。