📅  最后修改于: 2023-12-03 14:54:19.935000             🧑  作者: Mango
在 Laravel 中,当使用默认身份验证系统时,新注册用户需要通过电子邮件验证才能激活账户。然而,偶尔会有一些场景,比如快速测试或者在开发环境中,希望能够忽略电子邮件验证步骤,直接使用新注册的用户 ID。
以下是如何实现这种需求的步骤:
我们需要创建一个自定义验证规则来替代 Laravel 默认的验证规则,以便让新注册用户直接通过验证。
打开终端,输入以下代码来创建自定义验证规则:
php artisan make:rule IgnoreEmailVerificationRule
接着,打开刚刚创建的文件文件app/Rules/IgnoreEmailVerificationRule.php
,在其中添加以下代码:
<?php
namespace App\Rules;
use Illuminate\Contracts\Validation\Rule;
class IgnoreEmailVerificationRule implements Rule
{
/**
* Determine if the validation rule passes.
*
* @param string $attribute
* @param mixed $value
* @return bool
*/
public function passes($attribute, $value)
{
return true;
}
/**
* Get the validation error message.
*
* @return string
*/
public function message()
{
return '';
}
}
接下来,我们需要修改默认的注册验证规则,使用我们自定义的“忽略电子邮件验证”规则。打开app/Http/Controllers/Auth/RegisterController.php
文件,找到validator
方法。将以下代码:
protected function validator(array $data)
{
return Validator::make($data, [
'name' => ['required', 'string', 'max:255'],
'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
'password' => ['required', 'string', 'min:8', 'confirmed'],
]);
}
替换为以下代码:
protected function validator(array $data)
{
return Validator::make($data, [
'name' => ['required', 'string', 'max:255'],
'email' => ['sometimes', 'nullable'],
'password' => ['required', 'string', 'min:8', 'confirmed'],
]);
}
以上代码中,我们将验证规则变更为:
'email' => ['sometimes', 'nullable']
:即便用户提交了 email 字段,我们也不会强制要求其验证。最后一步的操作,是在新注册用户被创建后,将其 email 字段设置为 null
,以防其成为下一个被注册的用户,从而导致数据库中的唯一性约束失败。打开注册控制器文件app/Http/Controllers/Auth/RegisterController.php
,在create
方法中添加以下代码:
protected function create(array $data)
{
$user = User::create([
'name' => $data['name'],
'email' => null, // 置空 email 表示忽略验证
'password' => Hash::make($data['password']),
]);
return $user;
}
注意,为了消除肉眼观察上可能存在的安全隐患,我们应当在生产环境中隐藏「忽略电子邮件验证」的相关代码。可以考虑在env('APP_ENV')
与env('APP_DEBUG')
条件的基础上进行添加。
到这里,我们已经成功实现了 Laravel 中直接使用新注册用户的 ID 的操作。值得强调的是,在正式的项目中,我们不应频繁使用此技巧,以避免对账户体系造成不良影响。