【Laravel】e-mail confirmationの使い方まとめ

Laravel5.7からの新機能でe-mail-confirmationという
メール認証機能がありましたので
自分用のメモもかねて記事を書きます。

# 前提
Laravel5.7以上
※「laravel new」すれば問題ないかと思います。
メールの確認用にはLaravel公式ドキュメントでも紹介されている[mailtrap](https://mailtrap.io/inboxes/380350/messages)使用
Integrationsの部分、Laravelに選択すると、以下の情報が出てくるので、
表示させておいてください。


1.準備: Laravel構築、認証機能構築
参考： [Laravel構築チートシート](https://qiita.com/ProgramingDai/items/6fe5f678bf5a05e27c05)

`php artisan make:auth`
`php artisan migrate`

timezoneを日本時間に

```php:app/config/app.php
// - 'timezone' => 'UTC',
'timezone' => 'Asia/Tokyo',
```

2.Userモデル修正

```php:app/User.php
// 中略
// - use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Contracts\Auth\MustVerifyEmail as MustVerifyEmailContract;
use Illuminate\Auth\MustVerifyEmail;
// 中略
// - class User extends Authenticatable
class User extends Authenticatable implements MustVerifyEmailContract
{
    // - use Notifiable;
    use MustVerifyEmail, Notifiable;
// 中略
}
```

2.ルーティング修正

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

// - Route::get('/home', 'HomeController@index')->name('home');
Route::get('/home', 'HomeController@index')->name('home')->middleware('verified');
```

3.envファイルとmail.phpの設定
今回はローカル開発なので上記のMailtrapというWebアプリを使用します。
各自表示されている値に書き換え

.envファイル修正

```
中略
MAIL_DRIVER=smtp
MAIL_HOST=smtp.mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=（各自の値）
MAIL_PASSWORD=（各自の値）
MAIL_FROM_ADDRESS=from@example.com
MAIL_FROM_NAME=Example
中略
```

```php:config/mail.php
<?php
return [
  "driver" => "smtp",
  "host" => "smtp.mailtrap.io",
  "port" => 2525,
  "from" => array(
      "address" => "from@example.com",
      "name" => "Example"
  ),
  "username" => "（各自の値）",
  "password" => "（各自の値）",
  "sendmail" => "/usr/sbin/sendmail -bs"
];
```

ここまでで、メール認証は実装完了です。
ただし今のままだと英語のままになっているかと思います。

4.日本語に設定
□ビューファイル修正
こちらは各自でカスタマイズしてみてください。

```php: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

                    メールアドレスの認証をお願いします。<br>
                    もしメールを受け取ってないなら、<a href="{{ route('verification.resend') }}">ここをクリックしてください</a>。
                </div>
            </div>
        </div>
    </div>
</div>
@endsection
```

□本登録メール
`php artisan make:notification VerifyEmailJapanese`

そっくりそのまま書き換え
日本語で書いている部分は書き換えてもらってかまいません。

```php:app/Notifications/VerifyEmailJapanese.php
<?php

namespace App\Notifications;

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

class VerifyEmailJapanese 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)
    {
        if (static::$toMailCallback) {
            return call_user_func(static::$toMailCallback, $notifiable);
        }

        return (new MailMessage)
            ->subject(Lang::getFromJson('本登録メール'))
            ->line(Lang::getFromJson('以下の認証リンクをクリックして本登録を完了させてください。'))
            ->action(
                Lang::getFromJson('メールアドレスを認証する'),
                $this->verificationUrl($notifiable)
            )
            ->line(Lang::getFromJson('もしこのメールに覚えが無い場合は破棄してください。'));
    }

    /**
     * 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(60), ['id' => $notifiable->getKey()]
        );
    }

    /**
     * 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;
    }
}
```

最後にUserモデルに一部追加

```php:app/User.php
class User extends Authenticatable implements MustVerifyEmailContract
{
// 中略
    public function sendEmailVerificationNotification()
    {
        $this->notify(new \App\Notifications\VerifyEmailJapanese);
    }
}
```

以上で日本語化完了です。
Registerページから登録ボタンを押すと本当にMailtrapにメールが飛んできます。

これは感動します！