LoginSignup
0
0

More than 3 years have passed since last update.

【Laravel】Email Verification(メール確認)の実装

Last updated at Posted at 2020-06-26

概要

一般的なアプリケーションで会員登録する場合、
 1. 仮登録する
 2. メールにURLが届く
 3. URLをクリックして登録が完了する
という流れがありますよね
これができるようにLaravelのファイルをいじっていきましょう

前提

Laravel7で行います
あらかじめAuth機能を使えるようにしておいてください

% composer require laravel/ui
% php artisan ui vue --auth
% npm install && npm run dev

また、メールが送れるようにconfig/mail.phpや.envファイルを変更しておいてください

方法

さすがLaravelさん、こういう時のためにちゃんと用意してあるんですね
なんと、いじるファイルはUser.phpとweb.phpの2つだけ
必要な手順は以下の通り

  • マイグレーション
  • User.phpの編集
  • web.phpの編集

マイグレーション

% php artisan migrate

を実行してください
すでに実行している場合は必要ありません
これによって、メール確認に必要なemail_verified_atカラムを含んだusersテーブルが作成されます

User.php

app/User.php
class User extends Authenticatable implements MustVerifyEmail

Userクラスにimplements MustVerifyEmailを追加してください
これに必要なuseはすでに書かれてあります(さすが)
これによって、メール確認に必要な処理(URL生成やメール送信など)が追加されます

web.php

routes/web.php
Auth::routes(['verify' => true]);

Auth::routes()の引数に['verify' => true]を追加してください
これによって、メール確認に関連するルーティングが使用されます

カスタマイズ

ページの保護

仮登録や本登録を行うということは、本登録したユーザーだけがアクセスできるページがあるわけです
middlewareにverifiedを指定することで、ルートを保護できます
例を以下に示します

routes/web.php
Route::get('welcome', function() {
        ......
    })->middleware('verified');

Route::group(['middleware' => ['auth', 'verified']], function() {
    Route::get('index', HelloController@index);
    // このようにして保護したいルートをここに書く
}

ビュー

必要なビューは前提で実行したコマンドによって、すでに生成されています
メール確認のビューはresources/views/auth/verify.blade.phpにあります
自分の好きなようにカスタマイズしましょう

確認後のリダイレクト

メールアドレスを確認した後、自動的に表示させるページがあるといいですよね
デフォルトでは'/home'にリダイレクトすることになっていますが、これを変更するにためには、VerificationController.phpのredirectToにリダイレクト先を指定してください

RouteServiceProvider.phpのHOMEを変更する手段もありますが、こちらは、他のところでRouteServiceProvider::HOMEを参照している部分も一緒に変更できます

app/Http/Controllers/Auth/VerificationController.php
protected $redirectTo = '/home';
app/Providers/RouteServiceProvider.php
public const HOME = '/home'

日本語化

確認用のメールの内容を日本語化します
まず、以下のコマンドを実行します

php artisan make:notification VerifyEmailNotification

生成されたVerifyEmailNotification.phpの親クラスをVerifyEmailにし、toMailメソッドを以下のように変更します(オーバーライド)

app\Notifications\VerifyEmailNotification.php
use Illuminate\Auth\Notifications\VerifyEmail;

class VerifyEmailNotification extends VerifyEmail
{
    ...(省略)...

    public function toMail($notifiable)
    {
        $verificationUrl = $this->verificationUrl($notifiable);

        if (static::$toMailCallback) {
            return call_user_func(static::$toMailCallback, $notifiable, $verificationUrl);
        }

        return (new MailMessage)
            ->subject('メールアドレスの確認')
            ->line('以下のボタンをクリックして、メールアドレスの確認を行ってください。')
            ->action('メールアドレスの確認', $verificationUrl)
            ->line('もし心当たりがなければ、メールを破棄してください。');
    }
}

最後に、app\User.phpに以下のメソッドを追加します(オーバーライド)

app\User.php
    public function sendEmailVerificationNotification()
    {
        $this->notify(new VerifyEmailNotification());
    }

おわり

簡単でしたね
公式ドキュメントReadoubleを読めばいいので、ここで説明する必要なかったかもしれませんが、備忘録ということで書いてみました

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0