電子郵件驗證
簡介
許多網路應用程式要求使用者在使用應用程式之前驗證其電子郵件地址。Laravel 並非強迫您為每個您建立的應用程式手動重新實作此功能,而是提供了方便的內建服務來傳送和驗證電子郵件驗證請求。
想要快速入門嗎?在全新的 Laravel 應用程式中安裝其中一個 Laravel 應用程式入門套件。入門套件將負責架設您的整個驗證系統,包括電子郵件驗證支援。
模型準備
在開始之前,請確認您的 App\Models\User
模型實作了 Illuminate\Contracts\Auth\MustVerifyEmail
合約
<?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
事件
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
介面,連結就會自動以電子郵件傳送給使用者
Route::get('/email/verify', function () { return view('auth.verify-email');})->middleware('auth')->name('verification.notice');
返回電子郵件驗證通知的路由應命名為 verification.notice
。由於 Laravel 隨附的 verified
中介層,如果使用者尚未驗證其電子郵件地址,將自動重新導向至此路由名稱,因此路由必須指定此確切名稱。
手動實作電子郵件驗證時,您需要自行定義驗證通知視圖的內容。如果您想要包含所有必要驗證和驗證視圖的架構,請查看 Laravel 應用程式入門套件。
電子郵件驗證處理器
接下來,我們需要定義一個路由,該路由將處理當使用者點擊通過電子郵件傳送給他們的電子郵件驗證連結時產生的請求。此路由應命名為 verification.verify
,並指定 auth
和 signed
中介層
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 隨附的 表單請求。此請求將自動處理驗證請求的 id
和 hash
參數。
接下來,我們可以繼續直接呼叫請求上的 fulfill
方法。此方法將在經過驗證的使用者上呼叫 markEmailAsVerified
方法,並分派 Illuminate\Auth\Events\Verified
事件。markEmailAsVerified
方法可透過 Illuminate\Foundation\Auth\User
基類,在預設的 App\Models\User
模型中使用。一旦使用者的電子郵件地址經過驗證,您可以將他們重新導向至您想要的任何位置。
重新傳送驗證電子郵件
有時,使用者可能會遺失或不小心刪除電子郵件地址驗證電子郵件。為了處理這種情況,您可能希望定義一個路由,以允許使用者要求重新傳送驗證電子郵件。然後,您可以通過在您的驗證通知視圖中放置一個簡單的表單提交按鈕來向此路由發出請求
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
中介層配對
Route::get('/profile', function () { // Only verified users may access this route...})->middleware(['auth', 'verified']);
如果未經驗證的使用者嘗試存取已指定此中介層的路由,他們將自動重新導向至 verification.notice
命名路由。
自訂
自訂驗證電子郵件
儘管預設的電子郵件驗證通知應滿足大多數應用程式的需求,但 Laravel 允許您自訂電子郵件驗證郵件訊息的建構方式。
若要開始,請將閉包傳遞至 Illuminate\Auth\Notifications\VerifyEmail
通知提供的 toMailUsing
方法。閉包將接收接收通知的可通知模型執行個體,以及使用者必須造訪以驗證其電子郵件地址的簽署電子郵件驗證 URL。閉包應返回 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); });}
若要瞭解有關郵件通知的更多資訊,請參閱郵件通知文件。
事件
使用 Laravel 應用程式入門套件時,Laravel 會在電子郵件驗證過程中分派 Illuminate\Auth\Events\Verified
事件。如果您是手動處理應用程式的電子郵件驗證,您可能希望在驗證完成後手動分派這些事件。