📜  忽略电子邮件验证 laravel 上的用户 ID - PHP (1)

📅  最后修改于: 2023-12-03 14:54:19.935000             🧑  作者: Mango

忽略电子邮件验证 laravel 上的用户 ID - PHP

在 Laravel 中,当使用默认身份验证系统时,新注册用户需要通过电子邮件验证才能激活账户。然而,偶尔会有一些场景,比如快速测试或者在开发环境中,希望能够忽略电子邮件验证步骤,直接使用新注册的用户 ID。

以下是如何实现这种需求的步骤:

步骤 1:创建自定义验证规则

我们需要创建一个自定义验证规则来替代 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 '';
    }
}
步骤 2:修改注册验证规则

接下来,我们需要修改默认的注册验证规则,使用我们自定义的“忽略电子邮件验证”规则。打开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 字段,我们也不会强制要求其验证。
步骤 3:更新新注册用户的数据库记录

最后一步的操作,是在新注册用户被创建后,将其 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 的操作。值得强调的是,在正式的项目中,我们不应频繁使用此技巧,以避免对账户体系造成不良影响。