【Laravel8】メール認証を日本語化する

えび

Laravelでメール認証を日本語にしたときのメモ

ざっくり流れ

  1. authを有効にする
  2. ルーティングでメール認証を有効にする
  3. 既存のメール認証画面を日本語で書き換える
  4. 認証確認メールを日本語化にするためのNotificationを作成する
  5. Userモデルに諸々加筆する

make:authをまだしていなければ実行する

php artisan make:auth
php artisan migrate

これでauth関連が手早く実装される

ルーティングでメール認証を有効にする

  • routes/web.php
// ⭐️ 既存のAuth::routes()に引数を追加
Auth::routes(['verify' => true]);

// ⭐️ メール認証済みのユーザーしか見れない画面は'verified'を指定する
Route::middleware(['verified'])->group(function () {
    Route::get('/mypage', function () {
        return view('mypage');
    });
});

メール認証画面のviewを日本語化する

  • resources/views/auth/verify.blade.php
@extends('layouts.app')

@section('content')
    <div class="container">
        <div class="row justify-content-center">
            <div class="col-md-8">
                <div class="card">
                    <div class="card-header">メールアドレス認証</div>

                    <div class="card-body">
                        @if (session('resent'))
                            <div class="alert alert-success" role="alert">
                                認証メールを再送しました。
                            </div>
                        @endif

                        <p>認証メールを送信しました。届いたメールをご確認の上、記載のリンクから登録を完了させてください。</p>
                        <p>※メールが届かない場合は、入力したアドレスに間違いがあるか、あるいは迷惑メールフォルダに入っている可能性がありますのでご確認ください。</p>

                        <p>認証メールを再送する場合はこちらをクリックしてください。</p>
                        <form class="d-inline" method="POST" action="{{ route('verification.resend') }}">
                            @csrf
                            <button type="submit"
                                    class="btn btn-link p-0 m-0 align-baseline">メールを再送</button>
                        </form>
                    </div>
                </div>
            </div>
        </div>
    </div>
@endsection

認証確認メールを日本語化する

  • 認証メールカスタマイズ用のNotificationクラスを作る
php artisan make:notification VerifyEmail
  • app/Notifications/VerifyEmail.php
<?php

namespace App\Notifications;

use Illuminate\Notifications\Messages\MailMessage;
use Illuminate\Notifications\Notification;
use Illuminate\Support\Carbon;
use Illuminate\Support\Facades\Config;
use Illuminate\Support\Facades\Lang;
use Illuminate\Support\Facades\URL;

class VerifyEmail extends Notification
{
    /**
     * The callback that should be used to build the mail message.
     *
     * @var \Closure|null
     */
    public static $toMailCallback;

    /**
     * Get the notification's channels.
     *
     * @param mixed $notifiable
     * @return array|string
     */
    public function via($notifiable)
    {
        return ['mail'];
    }

    /**
     * Build the mail representation of the notification.
     *
     * @param mixed $notifiable
     * @return \Illuminate\Notifications\Messages\MailMessage
     */
    public function toMail($notifiable)
    {
        $verificationUrl = $this->verificationUrl($notifiable);

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

        return (new MailMessage)
            ->subject(Lang::get('message.Mail.Verify.Title'))
            ->view('emails.verify-email', ['url' => $this->verificationUrl($notifiable), 'user' => $notifiable]);
    }

    /**
     * Get the verification URL for the given notifiable.
     *
     * @param mixed $notifiable
     * @return string
     */
    protected function verificationUrl($notifiable)
    {
        return URL::temporarySignedRoute(
            'verification.verify',
            Carbon::now()->addMinutes(Config::get('auth.verification.expire', 60)),
            [
                'id' => $notifiable->getKey(),
                'hash' => sha1($notifiable->getEmailForVerification()),
            ]
        );
    }

    /**
     * Set a callback that should be used when building the notification mail message.
     *
     * @param \Closure $callback
     * @return void
     */
    public static function toMailUsing($callback)
    {
        static::$toMailCallback = $callback;
    }
}
  • resources/emails/verify-email.blade.php を新規作成
<h2>以下の認証リンクをクリックしてください。</h2>

<a href="{{ $url }}" rel="nofollow" target="_blank">メールアドレスを認証する</a>

<p>
    ※「ログインして本登録を完了する」ボタンをがクリックできない場合は以下のURLをコピーしてブラウザに貼り付けてください。<br>
    {{ $url }}
</p>
<p>※こちらのメールは送信専用のメールアドレスより送信しています。恐れ入りますが、直接返信しないようお願いします。</p>

Userモデルにメール認証に必要なクラスを実装する

  • app/Models/User.php
<?php

namespace App\Models;

use App\Notifications\VerifyEmail; // ⭐️ 作成した認証メール日本語化用のNotification
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;

class User extends Authenticatable implements MustVerifyEmail // ⭐️ implements追加
{
    use HasFactory, Notifiable;

    // ...(省略)

    /**
     * ⭐️ 認証メールを日本語化
     */
    public function sendEmailVerificationNotification()
    {
        $this->notify(new VerifyEmail());
    }
}

sendEmailVerificationNotification()メソッドをオーバーライドすることで
認証メール送信時に今回作成したNotificationが使用されるようになる

認証メールを任意のタイミングで送りたい場合はこちら

【Laravel】メールアドレス認証通知を手動で送信する