メールアドレスの確認
はじめに
多くのWebアプリケーションでは、ユーザーがアプリケーションを使用する前にメールアドレスを確認する必要があります。各作成するアプリケーションでこの機能を手動で再実装することなく、Laravelはメール確認リクエストの送信と確認のための便利な組込みサービスを提供しています。
すぐに始めたいですか?新しいLaravelアプリケーションにLaravelアプリケーションスターターキットの1つをインストールしてください。スターターキットは、メール確認サポートを含む認証システム全体のスキャフォールディングを自動的に処理します。
モデルの準備
始める前に、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
リスナ ーを自動的に登録するためです。
もしa starter kitを使用せずにアプリケーション内で登録を手動で実装している場合は、ユーザーの登録が成功した後に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
データベースマイグレーションに含まれています。
ルーティング
メールの確認を適切に実装するには、3 つのルートを定義する必要があります。まず、ユーザーに、登録後に 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');
次に進む前に、このルートを詳しく見てみましょう。まず、通常の Illuminate\Http\Request
インスタンスの代わりに EmailVerificationRequest
リクエストタイプを使用していることに気づくでしょう。EmailVerificationRequest
は Laravel に含まれる フォームリクエスト です。このリクエストは、リクエストの id
および hash
パラメータの検証を自動的に処理します。
次に、リクエスト上で fulfill
メソッドを呼び出すことができます。このメソッドは、認証されたユーザー上で markEmailAsVerified
メソッドを呼び出し、Illuminate\Auth\Events\Verified
イベントをディスパッチします。markEmailAsVerified
メソッドは、デフォルトの App\Models\User
モデルが Illuminate\Foundation\Auth\User
ベースクラスを介して利用できます。ユーザーのメールアドレスが確認されると、任意の場所にリダイレクトできます。