📅  最后修改于: 2023-12-03 15:02:39.145000             🧑  作者: Mango
在 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 中验证除自己之外的唯一电子邮件地址。