Laravel 8.x メール確認

イントロダクション

多くのWebアプリケーションはアプリケーション利用開始前に、ユーザーのメールアドレスを確認する必要があります。アプリケーションごとに再実装しなくても済むように、Laravelはメールを送信し、メールの確認リクエストを検証する便利なメソッドを用意しています。

Tip!! さっそく始めたいですか? Laravel Jetstreamを新しいLaravelアプリケーションにインストールしてください。データベースをマイグレーションしたら、ブラウザで/register、もしくはアプリケーションに割り振った他のURLを閲覧します。Jetstreamはメール確認のサポートを含む、認証システム全体のスカフォールドの面倒を見ます!

モデルの準備

使い始めるには、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;

    // ...
}

このインターフェイスがモデルに追加されると、新しく登録されたユーザーへメール確認リンクを含むメールが自動的に送信されます。EventServiceProviderを調べるとわかるように、LaravelははじめからIlluminate\Auth\Events\Registeredイベントに指定したSendEmailVerificationNotificationリスナを用意しています。

GLaravel Jetstreamを使用する代わりに、自前でユーザー登録をアプリケーションへ実装する場合は、ユーザーの登録成功後にIlluminate\Auth\Events\Registeredイベントを確実に発行してください。

use Illuminate\Auth\Events\Registered;

event(new Registered($user));

データベースの検討事項

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

php artisan migrate

ルート

電子メールの検証を適切に実装するには、3つのルートを定義する必要があります。まず、登録後にLaravelが送信する確認メールの中にある、メール確認リンクをクリックする必要がある旨の通知をユーザーに表示するためルートが必要です。次に、ユーザーがメール中のメール確認リンクをクリックしたときに生成されるリクエストを処理するためのルートが必要です。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 Jetstreamをチェックしてください。

メール確認のハンドラ

次に、メールで送信したメール確認リンクをユーザーがクリックしたときに送信してくるリクエストを処理するルートが必要です。このルートにはverification.verifyという名前を付け、authsignedミドルウェアを割り当てる必要があります。

use Illuminate\Foundation\Auth\EmailVerificationRequest;
use Illuminate\Http\Request;

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が用意しているform requestです。このリクエストタイプは、リクエストの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('status', '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 Jetstreamを使用している場合、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)へ移動

その他

?

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