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

Laravel unique email validation is not working on different character case in mongodb

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

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);
}

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

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

app/Rules/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',
        ]);
}

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

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

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

RegisterController.php

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',
    ]);  
}

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

Form Request Validation: After Hooks

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

/**
 * 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!');
        }
    });
}

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

Middleware?

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

<?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);
    }
}

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

我有最简单的解决方案来解决 MySql 中 Laravel

中的独特电子邮件问题

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

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

这解决了我的区分大小写和独特的问题,不需要对任何控制器和模型脚本进行任何更改。感谢提问。