📜  电子邮件验证 laravel - PHP (1)

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

电子邮件验证 Laravel - PHP

简介

在web应用程序中,电子邮件验证是一个很常见的功能,它可以保证用户输入的电子邮件地址是正确且可用的。Laravel框架提供了很方便的功能来实现电子邮件验证。本文将介绍如何在Laravel中实现电子邮件验证。

步骤
1. 安装依赖包

首先,在composer.json文件的require部分中添加以下依赖包:

"require": {
    "laravel/framework": "5.8.*",
    "illuminate/mail": "5.8.*"
}

然后,在命令行中执行以下命令来安装依赖:

composer install
2. 设置mail配置

.env文件中,填写相关的mail配置信息,例如:

MAIL_DRIVER=smtp
MAIL_HOST=smtp.mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=your_username
MAIL_PASSWORD=your_password
MAIL_ENCRYPTION=null

这里我们使用Mailtrap作为邮件服务,并填写相应的用户名和密码。如果你使用的是其他邮件服务,需要根据实际情况填写。

3. 生成验证器

接下来,在命令行中执行以下命令,生成一个验证器:

php artisan make:request VerifyEmailRequest

这里我们将验证器命名为VerifyEmailRequest,你可以使用任意的名称。然后打开生成的VerifyEmailRequest.php文件,在rules()方法中添加以下规则:

public function rules()
{
    return [
        'email' => 'required|email|unique:users'
    ];
}

其中,email是验证的字段名。 required表示该字段不可为空,email表示该字段需要为正确的email格式, unique:users则表示该字段的值在users表中需要是唯一的。

4. 修改注册逻辑

打开app/Http/Controllers/Auth/RegisterController.php文件,在create()方法中,将$user对象的相应字段赋值后,调用其sendEmailVerificationNotification()方法后保存用户:

protected function create(array $data)
{
    $user = new User;
    $user->name = $data['name'];
    $user->email = $data['email'];
    $user->password = Hash::make($data['password']);

    $user->sendEmailVerificationNotification();

    $user->save();

    return $user;
}

这里我们在create()方法中调用sendEmailVerificationNotification()方法,该方法会在用户保存到数据库后发送验证邮件至用户提供的 email 地址。

5. 处理验证请求

当用户点击验证邮件中的链接后,将跳转到在 .env 文件中设置的 APP_URL 常量连接,该 URL 由 Illuminate/Routing/UrlGenerator 类生成。 跳转后将请求进入verify路由。打开routes/web.php文件,添加以下代码:

Route::get('email/verify/{token}', 'Auth\VerificationController@verify')->name('verification.verify');
Route::get('email/resend', 'Auth\VerificationController@resend')->name('verification.resend');

其中,第一行代码表示当用户点击验证邮件中的链接时,将调用Auth\VerificationControllerverify()方法。第二行代码表示当用户请求重新发送验证邮件时,调用Auth\VerificationControllerresend()方法。

接下来,在命令行中执行以下命令,生成控制器:

php artisan make:controller Auth/VerificationController

打开app/Http/Controllers/Auth/VerificationController.php文件,在__construct()方法中添加相应的 middleware:

public function __construct()
{
    $this->middleware('auth');
    $this->middleware('signed')->only('verify');
    $this->middleware('throttle:6,1')->only('verify', 'resend');
}

该middleware可以确保只有经过身份验证的用户才能访问verify()方法,同时限制每分钟的访问次数。然后在 verify() 方法中执行以下代码:

public function verify(Request $request)
{
    $user = User::find($request->route('id'));

    if ($user->hasVerifiedEmail()) {
        return redirect($this->redirectPath());
    }

    if ($user->markEmailAsVerified()) {
        event(new Verified($user));
    }

    return redirect($this->redirectPath())->with('verified', true);
}

其中,$user->markEmailAsVerified()方法将把该用户email验证标记为 true。event(new Verified($user))表示触发Verified事件,以便自定义进一步的操作。最后将重定向到$this->redirectPath()上,并把 verified 标记设置为 true。

6. 整合验证功能

最后,在注册登录逻辑的相应控制器(如 app/Http/Controllers/Auth/LoginController.php)中加入以下代码:

use Illuminate\Foundation\Auth\VerifiesEmails;

class LoginController extends Controller
{
    use VerifiesEmails;
    
    ……
}

这里我们使用了VerifiesEmails trait,该trait内部带有许多默认的方法实现了所有电子邮件验证所需的路由和方法。

至此,Laravel电子邮件验证功能已经完成。 当用户在注册后验证他们的电子邮件地址时,不仅可以增加网站的安全性,还可以确保用户提供的电子邮件地址是正确的且可用的。

参考