はじめに

多くのウェブアプリケーションでは、ユーザーがアプリケーションを使用する前にメールアドレスを確認する必要があります。作成する各アプリケーションに対してこの機能を手動で再実装することを強制するのではなく、Laravelはメール確認リクエストの送信と確認のための便利な組み込みサービスを提供します。

すぐに始めたいですか?新しいLaravelアプリケーションにLaravelアプリケーションスターターキットの1つをインストールしてください。スターターキットは、メール確認サポートを含む認証システム全体のスキャフォールディングを処理します。

モデルの準備

始める前に、App\Models\UserモデルがIlluminate\Contracts\Auth\MustVerifyEmail契約を実装していることを確認してください:

  1. <?php
  2. namespace App\Models;
  3. use Illuminate\Contracts\Auth\MustVerifyEmail;
  4. use Illuminate\Foundation\Auth\User as Authenticatable;
  5. use Illuminate\Notifications\Notifiable;
  6. class User extends Authenticatable implements MustVerifyEmail
  7. {
  8. use Notifiable;
  9. // ...
  10. }

このインターフェースがモデルに追加されると、新しく登録されたユーザーには自動的にメール確認リンクを含むメールが送信されます。これは、LaravelがIlluminate\Auth\Listeners\SendEmailVerificationNotification リスナーIlluminate\Auth\Events\Registeredイベントに自動的に登録するため、シームレスに行われます。

スターターキットを使用せずにアプリケーション内で手動で登録を実装している場合は、ユーザーの登録が成功した後にIlluminate\Auth\Events\Registeredイベントをディスパッチしていることを確認してください:

  1. use Illuminate\Auth\Events\Registered;
  2. event(new Registered($user));

データベースの準備

次に、usersテーブルには、ユーザーのメールアドレスが確認された日時を保存するためのemail_verified_at列が含まれている必要があります。通常、これはLaravelのデフォルトの0001_01_01_000000_create_users_table.phpデータベースマイグレーションに含まれています。

ルーティング

メール確認を適切に実装するには、3つのルートを定義する必要があります。まず、ユーザーに登録後にLaravelが送信した確認メールのメール確認リンクをクリックするように通知するルートが必要です。

次に、ユーザーがメール内のメール確認リンクをクリックしたときに生成されるリクエストを処理するためのルートが必要です。

3つ目は、ユーザーが最初の確認リンクを誤って失くした場合に確認リンクを再送信するためのルートが必要です。

メール確認通知

前述のように、ユーザーに登録後にLaravelからメールで送信されたメール確認リンクをクリックするように指示するビューを返すルートを定義する必要があります。このビューは、ユーザーが最初にメールアドレスを確認せずにアプリケーションの他の部分にアクセスしようとしたときに表示されます。リンクは、App\Models\UserモデルがMustVerifyEmailインターフェースを実装している限り、自動的にユーザーにメールで送信されることを忘れないでください:

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

メール確認通知を返すルートはverification.noticeという名前にする必要があります。このルートにこの正確な名前が割り当てられていることが重要です。なぜなら、verifiedミドルウェアLaravelに含まれているは、ユーザーがメールアドレスを確認していない場合に自動的にこのルート名にリダイレクトするからです。

メール確認を手動で実装する場合は、確認通知ビューの内容を自分で定義する必要があります。必要なすべての認証および確認ビューを含むスキャフォールディングが必要な場合は、Laravelアプリケーションスターターキットをチェックしてください。

メール確認ハンドラー

次に、ユーザーがメールで送信されたメール確認リンクをクリックしたときに生成されるリクエストを処理するルートを定義する必要があります。このルートはverification.verifyという名前にし、authおよびsignedミドルウェアを割り当てる必要があります:

  1. use Illuminate\Foundation\Auth\EmailVerificationRequest;
  2. Route::get('/email/verify/{id}/{hash}', function (EmailVerificationRequest $request) {
  3. $request->fulfill();
  4. return redirect('/home');
  5. })->middleware(['auth', 'signed'])->name('verification.verify');

次に進む前に、このルートを詳しく見てみましょう。まず、通常のIlluminate\Http\Requestインスタンスの代わりにEmailVerificationRequestリクエストタイプを使用していることに気付くでしょう。EmailVerificationRequestは、Laravelに含まれているフォームリクエストです。このリクエストは、リクエストのidおよびhashパラメータの検証を自動的に処理します。

次に、リクエストのfulfillメソッドを直接呼び出すことができます。このメソッドは、認証されたユーザーのmarkEmailAsVerifiedメソッドを呼び出し、Illuminate\Auth\Events\Verifiedイベントをディスパッチします。markEmailAsVerifiedメソッドは、Illuminate\Foundation\Auth\Userベースクラスを介してデフォルトのApp\Models\Userモデルで利用可能です。ユーザーのメールアドレスが確認されたら、任意の場所にリダイレクトできます。

確認メールの再送信

時々、ユーザーがメールアドレス確認メールを誤って失くしたり削除したりすることがあります。これに対応するために、ユーザーが確認メールを再送信するようにリクエストできるルートを定義したい場合があります。このルートにリクエストを行うために、確認通知ビュー内にシンプルなフォーム送信ボタンを配置することができます:

  1. use Illuminate\Http\Request;
  2. Route::post('/email/verification-notification', function (Request $request) {
  3. $request->user()->sendEmailVerificationNotification();
  4. return back()->with('message', 'Verification link sent!');
  5. })->middleware(['auth', 'throttle:6,1'])->name('verification.send');

ルートの保護

ルートミドルウェアを使用して、確認済みのユーザーのみが特定のルートにアクセスできるようにすることができます。Laravelには、verified ミドルウェアエイリアスが含まれており、これはIlluminate\Auth\Middleware\EnsureEmailIsVerifiedミドルウェアクラスのエイリアスです。このエイリアスはすでにLaravelによって自動的に登録されているため、verifiedミドルウェアをルート定義に添付するだけで済みます。通常、このミドルウェアはauthミドルウェアとペアになります:

  1. Route::get('/profile', function () {
  2. // Only verified users may access this route...
  3. })->middleware(['auth', 'verified']);

確認されていないユーザーがこのミドルウェアが割り当てられたルートにアクセスしようとすると、自動的にverification.notice 名前付きルートにリダイレクトされます。

カスタマイズ

確認メールのカスタマイズ

デフォルトのメール確認通知はほとんどのアプリケーションの要件を満たすはずですが、Laravelではメール確認メールメッセージの構築方法をカスタマイズすることができます。

始めるには、toMailUsingメソッドにクロージャを渡します。クロージャは、通知を受け取るノーティファイアモデルインスタンスと、ユーザーがメールアドレスを確認するために訪れる必要がある署名されたメール確認URLを受け取ります。クロージャはIlluminate\Notifications\Messages\MailMessageのインスタンスを返す必要があります。通常、bootクラスのAppServiceProviderメソッドからtoMailUsingメソッドを呼び出すべきです:

  1. use Illuminate\Auth\Notifications\VerifyEmail;
  2. use Illuminate\Notifications\Messages\MailMessage;
  3. /**
  4. * Bootstrap any application services.
  5. */
  6. public function boot(): void
  7. {
  8. // ...
  9. VerifyEmail::toMailUsing(function (object $notifiable, string $url) {
  10. return (new MailMessage)
  11. ->subject('Verify Email Address')
  12. ->line('Click the button below to verify your email address.')
  13. ->action('Verify Email Address', $url);
  14. });
  15. }

メール通知について詳しく知りたい場合は、メール通知のドキュメントを参照してください。

イベント

Laravelアプリケーションスターターキットを使用している場合、Laravelはメール確認プロセス中にIlluminate\Auth\Events\Verified イベントをディスパッチします。アプリケーションのメール確認を手動で処理している場合は、確認が完了した後にこれらのイベントを手動でディスパッチすることを検討してください。