📜  laravel 验证除了自己之外的唯一电子邮件 - PHP (1)

📅  最后修改于: 2023-12-03 15:02:39.145000             🧑  作者: Mango

Laravel 验证除了自己之外的唯一电子邮件

在 Laravel 应用程序中,您可能需要确保电子邮件地址在数据库中唯一。 Laravel 为此提供了一个非常方便的验证规则,即 unique。但是,在某些情况下,您希望用户能够保留他们当前使用的电子邮件地址,但其他用户不能注册使用此电子邮件地址。

本文将向您展示如何创建自定义验证规则以在 Laravel 中验证除自己之外的唯一电子邮件地址。

创建自定义验证规则

首先,我们需要创建一个自定义验证规则类。您可以使用 Artisan 命令 make:rule 来完成此操作,它将为您生成一个包含骨架代码的 EmailUniqueExceptSelf 类文件。

php artisan make:rule EmailUniqueExceptSelf

在生成的类中,我们需要实现 Illuminate\Contracts\Validation\Rule 接口。在 passes 方法中,我们将使用 unique 验证规则来验证除自己之外的电子邮件地址是否唯一。在此之前,我们需要创建一个构造函数,接收当前用户的 ID,这样我们才能在验证规则中排除它。

<?php

namespace App\Rules;

use Illuminate\Contracts\Validation\Rule;
use Illuminate\Support\Facades\Auth;
use Illuminate\Validation\Rule as ValidationRule;

class EmailUniqueExceptSelf implements Rule
{
    protected $userId;

    public function __construct($userId)
    {
        $this->userId = $userId;
    }

    public function passes($attribute, $value)
    {
        return ValidationRule::unique('users', 'email')
            ->ignore($this->userId)
            ->where(function ($query) use ($value) {
                return $query->where('email', $value);
            })
            ->count() === 0;
    }

    public function message()
    {
        return 'The :attribute has already been taken.';
    }
}

passes 方法中,我们使用 ValidationRule::unique 创建了一个 unique 验证规则实例,该实例验证数据库中的 users 表中除 $this->userId 之外的电子邮件地址是否唯一。

最后,我们需要在应用程序中使用新的自定义验证规则。

使用自定义验证规则

在需要验证除自己之外的唯一电子邮件地址的地方,我们可以使用 EmailUniqueExceptSelf 规则。

<?php

use App\Rules\EmailUniqueExceptSelf;

$request->validate([
    'email' => [
        'required',
        'email',
        new EmailUniqueExceptSelf(Auth::user()->id),
    ],
]);

在这个例子中,我们将 EmailUniqueExceptSelf 的实例传递给 email 字段的验证规则数组中。我们还将当前用户的 ID 传递给构造函数,以便在验证规则中排除它。

结论

创建自定义验证规则可以大大提高 Laravel 应用程序的可维护性和可扩展性。在这篇文章中,我们向您展示了如何创建自定义验证规则以在 Laravel 中验证除自己之外的唯一电子邮件地址。