簡介 (簡介)
許多 Web 應用程式在使用者使用應用程式之前,會要求使用者驗證其電子郵件地址。Laravel 提供了方便的內建服務來發送和驗證電子郵件驗證請求,而不是強迫你為每個應用程式手動重新實作此功能。
[!NOTE] 想要快速開始嗎?在全新的 Laravel 應用程式中安裝其中一個 Laravel 應用程式入門套件。入門套件將負責為你建立整個身份驗證系統,包括電子郵件驗證支援。
Model 準備 (Model 準備)
在開始之前,請確認你的 App\Models\User model 實作了 Illuminate\Contracts\Auth\MustVerifyEmail contract:
<?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;
// ...
}
一旦將此介面新增到你的 model 中,新註冊的使用者將自動收到一封包含電子郵件驗證連結的電子郵件。這會無縫發生,因為 Laravel 會自動為 Illuminate\Auth\Events\Registered 事件註冊 Illuminate\Auth\Listeners\SendEmailVerificationNotification 監聽器。
如果你是在應用程式中手動實作註冊,而不是使用 入門套件,你應該確保在使用者註冊成功後分派 Illuminate\Auth\Events\Registered 事件:
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 model 實作了 MustVerifyEmail 介面,該連結就會自動發送給使用者:
Route::get('/email/verify', function () {
return view('auth.verify-email');
})->middleware('auth')->name('verification.notice');
返回電子郵件驗證通知的路由應命名為 verification.notice。將路由分配為此確切名稱非常重要,因為如果使用者尚未驗證其電子郵件地址,Laravel 包含的 verified middleware 將自動重新導向到此路由名稱。
[!NOTE] 手動實作電子郵件驗證時,你需要自己定義驗證通知視圖的內容。如果你想要包含所有必要的身份驗證和驗證視圖的 scaffolding,請查看 Laravel 應用程式入門套件。
電子郵件驗證處理器 (電子郵件驗證處理器)
接下來,我們需要定義一個路由,該路由將處理使用者點擊發送給他們的電子郵件驗證連結時產生的請求。此路由應命名為 verification.verify,並分配 auth 和 signed middleware:
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 包含的 form request。此請求將自動負責驗證請求的 id 和 hash 參數。
接下來,我們可以直接在請求上呼叫 fulfill 方法。此方法將在經過身份驗證的使用者上呼叫 markEmailAsVerified 方法,並分派 Illuminate\Auth\Events\Verified 事件。markEmailAsVerified 方法可透過 Illuminate\Foundation\Auth\User 基類在預設的 App\Models\User model 中使用。一旦使用者的電子郵件地址經過驗證,你可以將他們重新導向到你希望的任何地方。
重新發送驗證電子郵件 (重新發送驗證電子郵件)
有時使用者可能會放錯地方或不小心刪除了電子郵件地址驗證電子郵件。為了適應這種情況,你可能希望定義一個路由,允許使用者請求重新發送驗證電子郵件。然後,你可以透過在 驗證通知視圖 中放置一個簡單的表單提交按鈕來向此路由發出請求:
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');
保護路由 (保護路由)
路由 Middleware 可用於僅允許經過驗證的使用者存取給定的路由。Laravel 包含一個 verified middleware 別名,它是 Illuminate\Auth\Middleware\EnsureEmailIsVerified middleware 類別的別名。由於此別名已由 Laravel 自動註冊,因此你只需將 verified middleware 附加到路由定義即可。通常,此 middleware 與 auth middleware 配對使用:
Route::get('/profile', function () {
// Only verified users may access this route...
})->middleware(['auth', 'verified']);
如果未經身份驗證的使用者嘗試存取已分配此 middleware 的路由,他們將自動重新導向到 verification.notice 命名路由。
自訂 (自訂)
驗證電子郵件自訂 (Verification Email Customization)
雖然預設的電子郵件驗證通知應能滿足大多數應用程式的需求,但 Laravel 允許你自訂電子郵件驗證郵件訊息的建構方式。
首先,將一個 Closure 傳遞給 Illuminate\Auth\Notifications\VerifyEmail 通知提供的 toMailUsing 方法。該 Closure 將接收正在接收通知的 notifiable model 實例以及使用者必須造訪以驗證其電子郵件地址的簽名電子郵件驗證 URL。該 Closure 應返回 Illuminate\Notifications\Messages\MailMessage 的實例。通常,你應該從應用程式的 AppServiceProvider 類別的 boot 方法中呼叫 toMailUsing 方法:
use Illuminate\Auth\Notifications\VerifyEmail;
use Illuminate\Notifications\Messages\MailMessage;
/**
* Bootstrap any application services.
*/
public function boot(): void
{
// ...
VerifyEmail::toMailUsing(function (object $notifiable, string $url) {
return (new MailMessage)
->subject('Verify Email Address')
->line('Click the button below to verify your email address.')
->action('Verify Email Address', $url);
});
}
[!NOTE] 要了解有關郵件通知的更多資訊,請參閱 郵件通知文件。
事件 (事件)
使用 Laravel 應用程式入門套件 時,Laravel 會在電子郵件驗證過程中分派 Illuminate\Auth\Events\Verified 事件。如果你正在為應用程式手動處理電子郵件驗證,你可能希望在驗證完成後手動分派這些事件。