Laravel 8.x メール確認

イントロダクション

多くのWebアプリケーションでは、ユーザーがアプリケーションを使用開始する前に電子メールアドレスを確認する必要があります。Laravelでは、作成するアプリケーションごとにこの機能を手動で再実装する必要はなく、電子メール確認リクエストを送信および検証するための便利な組み込みサービスを提供しています。

Tip!! てっとり早く始めたいですか?Laravelアプリケーションスターターキットの1つを新しい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;

    // ...
}

このインターフェイスをモデルへ追加したら、新しく登録したユーザーへ、確認リンクを含む電子メールが自動的に送信されます。アプリケーションのApp\Providers\EventServiceProviderを調べるとわかるように、はじめからLaravelは、Illuminate\Auth\Events\Registeredイベントへアタッチ済みのSendEmailVerificationNotificationリスナを用意してあります。このイベントリスナが、電子メール確認リンクをユーザーへ送信します。

スターターキットを使用する代わりに、アプリケーション内で手動で登録を実装する場合は、ユーザーの登録が成功した後に、Illuminate\Auth\Events\Registeredイベントを確実に発行してください。

use Illuminate\Auth\Events\Registered;

event(new Registered($user));

データベースの検討事項

次に、usersテーブルにユーザーの電子メールアドレスが確認された日時を格納するためのemail_verified_atカラムを用意する必要があります。デフォルトでLaravelフレームワークに含まれているusersテーブルのマイグレーションには、はじめからこのカラムが含まれています。したがって、必要なのはデータベースのマイグレーションを実行することだけです。

php artisan migrate

ルート

電子メール確認を適切に実装するには、3つのルートを定義する必要があります。第1に、Laravelがユーザー登録後に送信する確認メール中のメールアドレス確認リンクをクリックする必要があるという通知をユーザーに表示するためのルートが必要になります。

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

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

メール確認の通知

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

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

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

Tip!! 電子メール検証を手動で実装する場合は、検証通知ビューの内容を自分で定義する必要があります。必要なすべての認証ビューと検証ビューを含むスカフォールドが必要な場合は、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メソッドは、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には、Illuminate\Auth\Middleware\EnsureEmailIsVerifiedクラスを参照するverifiedミドルウェアが付属しています。このミドルウェアはアプリケーションのHTTPカーネルではじめから登録されているため、必要なのはミドルウェアをルート定義にアタッチすることだけです。

Route::get('/profile', function () {
    // 確認済みのユーザーのみがこのルートにアクセス可能
})->middleware('verified');

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

カスタマイズ

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

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

取り掛かるには、Illuminate\Auth\Notifications\VerifyEmail通知によって提供されるtoMailUsingメソッドにクロージャを渡します。クロージャは、通知を受信するnotifiableモデルインスタンスと、ユーザーがメールアドレスを確認するためにアクセスする必要のある署名済みのメール確認URLを受け取ります。クロージャは、Illuminate\Notifications\Messages\MailMessageのインスタンスを返す必要があります。通常、アプリケーションのApp\Providers\AuthServiceProviderクラスのbootメソッドからtoMailUsingメソッドを呼び出す必要があります。

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

/**
 * 全認証/承認サービスの登録
 *
 * @return void
 */
public function boot()
{
    // …

    VerifyEmail::toMailUsing(function ($notifiable, $url) {
        return (new MailMessage)
            ->subject('Verify Email Address')
            ->line('Click the button below to verify your email address.')
            ->action('Verify Email Address', $url);
    });
}

Tip!! メール通知の詳細は、メール通知ドキュメントを参照してください。

イベント

Laravelアプリケーションスターターキットを使用する場合、Laravelはメール確認プロセス中にイベントを発行します。アプリケーションの電子メール確認を手動で処理する場合は、確認の完了後にこれらのイベントを手動で発行することを推奨します。アプリケーションのEventServiceProviderでこれらのイベントへリスナをアタッチできます。

/**
 * アプリケーションにマップするイベントリスナ
 *
 * @var array
 */
protected $listen = [
    'Illuminate\Auth\Events\Verified' => [
        'App\Listeners\LogVerifiedUser',
    ],
];

ドキュメント章別ページ

ヘッダー項目移動

注目:アイコン:ページ内リンク設置(リンクがないヘッダーへの移動では、リンクがある以前のヘッダーのハッシュをURLへ付加します。

移動

クリックで即時移動します。

設定

適用ボタンクリック後に、全項目まとめて適用されます。

カラーテーマ
和文指定 Pagination
和文指定 Scaffold
Largeスクリーン表示幅
インデント
本文フォント
コードフォント
フォント適用確認

フォントの指定フィールドから、フォーカスが外れると、当ブロックの内容に反映されます。EnglishのDisplayもPreviewしてください。

フォント設定時、表示に不具合が出た場合、当サイトのクッキーを削除してください。

バックスラッシュを含むインライン\Code\Blockの例です。

以下はコードブロックの例です。

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    /**
     * ユーザに関連する電話レコードを取得
     */
    public function phone()
    {
        return $this->hasOne('App\Phone');
    }
}

設定を保存する前に、表示が乱れないか必ず確認してください。CSSによるフォントファミリー指定の知識がない場合は、フォントを変更しないほうが良いでしょう。

キーボード・ショートカット

オープン操作

PDC

ページ(章)移動の左オフキャンバスオープン

HA

ヘッダー移動モーダルオープン

MS

移動/設定の右オフキャンバスオープン

ヘッダー移動

T

最初のヘッダーへ移動

E

最後のヘッダーへ移動

NJ

次ヘッダー(H2〜H4)へ移動

BK

前ヘッダー(H2〜H4)へ移動

その他

?

このヘルプページ表示
閉じる