Skip to content
赞助商赞助商赞助商
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待

邮件验证

介绍

许多网络应用程序要求用户在使用应用程序之前验证他们的电子邮件地址。Laravel 提供了方便的内置服务来发送和验证电子邮件验证请求,而不是让您为每个创建的应用程序手动重新实现此功能。

NOTE

想快速开始吗?在一个新的 Laravel 应用程序中安装一个 Laravel 应用程序入门套件。入门套件将负责搭建整个身份验证系统,包括电子邮件验证支持。

模型准备

在开始之前,请验证您的 App\Models\User 模型是否实现了 Illuminate\Contracts\Auth\MustVerifyEmail 合约:

php
<?php

namespace App\Models;

use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;

class User extends Authenticatable implements MustVerifyEmail
{
    use Notifiable;

    // ...
}

一旦将此接口添加到您的模型中,新注册的用户将自动收到包含电子邮件验证链接的电子邮件。这是无缝进行的,因为 Laravel 自动为 Illuminate\Auth\Events\Registered 事件注册了 Illuminate\Auth\Listeners\SendEmailVerificationNotification 监听器

如果您在应用程序中手动实现注册而不是使用 入门套件,您应该确保在用户注册成功后调度 Illuminate\Auth\Events\Registered 事件:

php
use Illuminate\Auth\Events\Registered;

event(new Registered($user));

数据库准备

接下来,您的 users 表必须包含一个 email_verified_at 列来存储用户电子邮件地址被验证的日期和时间。通常,这包含在 Laravel 的默认 0001_01_01_000000_create_users_table.php 数据库迁移中。

路由

要正确实现电子邮件验证,需要定义三个路由。首先,需要一个路由来向用户显示通知,告知他们应点击注册后 Laravel 发送的验证邮件中的电子邮件验证链接。

其次,需要一个路由来处理用户点击电子邮件中的电子邮件验证链接时生成的请求。

第三,需要一个路由来重新发送验证链接,以防用户意外丢失第一个验证链接。

邮件验证通知

如前所述,应定义一个路由,该路由将返回一个视图,指示用户点击注册后 Laravel 通过电子邮件发送给他们的电子邮件验证链接。当用户在未先验证其电子邮件地址的情况下尝试访问应用程序的其他部分时,将向他们显示此视图。请记住,只要您的 App\Models\User 模型实现了 MustVerifyEmail 接口,链接就会自动通过电子邮件发送给用户:

php
Route::get('/email/verify', function () {
    return view('auth.verify-email');
})->middleware('auth')->name('verification.notice');

返回电子邮件验证通知的路由应命名为 verification.notice。重要的是,该路由必须分配此确切名称,因为如果用户尚未验证其电子邮件地址,Laravel 包含的 verified 中间件将自动重定向到此路由名称。

NOTE

在手动实现电子邮件验证时,您需要自己定义验证通知视图的内容。如果您希望包含所有必要的身份验证和验证视图的脚手架,请查看 Laravel 应用程序入门套件

邮件验证处理程序

接下来,我们需要定义一个路由来处理用户点击电子邮件中电子邮件验证链接时生成的请求。此路由应命名为 verification.verify 并分配 authsigned 中间件:

php
use Illuminate\Foundation\Auth\EmailVerificationRequest;

Route::get('/email/verify/{id}/{hash}', function (EmailVerificationRequest $request) {
    $request->fulfill();

    return redirect('/home');
})->middleware(['auth', 'signed'])->name('verification.verify');

在继续之前,让我们仔细看看这个路由。首先,您会注意到我们使用的是 EmailVerificationRequest 请求类型,而不是典型的 Illuminate\Http\Request 实例。EmailVerificationRequest 是一个 表单请求,包含在 Laravel 中。此请求将自动负责验证请求的 idhash 参数。

接下来,我们可以直接调用请求上的 fulfill 方法。此方法将调用经过身份验证的用户的 markEmailAsVerified 方法并调度 Illuminate\Auth\Events\Verified 事件。markEmailAsVerified 方法通过 Illuminate\Foundation\Auth\User 基类提供给默认的 App\Models\User 模型。一旦用户的电子邮件地址被验证,您可以将他们重定向到您希望的任何地方。

重新发送验证邮件

有时用户可能会丢失或意外删除电子邮件地址验证邮件。为此,您可能希望定义一个路由,以允许用户请求重新发送验证邮件。然后,您可以通过在 验证通知视图 中放置一个简单的表单提交按钮来请求此路由:

php
use Illuminate\Http\Request;

Route::post('/email/verification-notification', function (Request $request) {
    $request->user()->sendEmailVerificationNotification();

    return back()->with('message', 'Verification link sent!');
})->middleware(['auth', 'throttle:6,1'])->name('verification.send');

保护路由

路由中间件 可用于仅允许经过验证的用户访问给定路由。Laravel 包含一个 verified 中间件别名,它是 Illuminate\Auth\Middleware\EnsureEmailIsVerified 中间件类的别名。由于此别名已由 Laravel 自动注册,您只需将 verified 中间件附加到路由定义即可。通常,此中间件与 auth 中间件配对:

php
Route::get('/profile', function () {
    // 只有经过验证的用户才能访问此路由...
})->middleware(['auth', 'verified']);

如果未经验证的用户尝试访问已分配此中间件的路由,他们将自动重定向到 verification.notice 命名路由

自定义

验证邮件自定义

尽管默认的电子邮件验证通知应满足大多数应用程序的要求,但 Laravel 允许您自定义电子邮件验证邮件消息的构建方式。

要开始,请将闭包传递给 Illuminate\Auth\Notifications\VerifyEmail 通知提供的 toMailUsing 方法。闭包将接收接收通知的可通知模型实例以及用户必须访问以验证其电子邮件地址的签名电子邮件验证 URL。闭包应返回 Illuminate\Notifications\Messages\MailMessage 的实例。通常,您应从应用程序的 AppServiceProvider 类的 boot 方法中调用 toMailUsing 方法:

php
use Illuminate\Auth\Notifications\VerifyEmail;
use Illuminate\Notifications\Messages\MailMessage;

/**
 * 启动任何应用程序服务。
 */
public function boot(): void
{
    // ...

    VerifyEmail::toMailUsing(function (object $notifiable, string $url) {
        return (new MailMessage)
            ->subject('验证电子邮件地址')
            ->line('点击下面的按钮以验证您的电子邮件地址。')
            ->action('验证电子邮件地址', $url);
    });
}

NOTE

要了解有关邮件通知的更多信息,请查阅 邮件通知文档

事件

使用 Laravel 应用程序入门套件 时,Laravel 在电子邮件验证过程中调度 Illuminate\Auth\Events\Verified 事件。如果您为应用程序手动处理电子邮件验证,您可能希望在验证完成后手动调度这些事件。