最新Laravel 5.7の便利な機能「正しいメールアドレスのみ登録させる機能：Email Verification」

![image.png](https://qiita-image-store.s3.amazonaws.com/0/104530/60c13902-9078-3a4a-54c3-380066e5be07.png)
#Laravel5.7で追加された「 Email Verification 」とは？
サインアップ（Register）時に登録したメールアドレスに「URLを自動で記載してメールを送信」し、受信したメールアドレスから「記載されてるURLをクリック」して登録完了になる最近良く見かけるやつですね！
認証画面はとても簡単に作れてたのですが、これって適当なメールアドレス何じゃない？？？的なEmailアドレス確認が取れなかったので、これは助かります！！！
（Laravel5.7仕様は https://laravel.com/docs/5.7/verification を参考に）


##使った環境
Apache2
Laravel 5.7
PHPバージョン PHP7.1.20
Cloud9


##前提条件
```terminal:command
php artisan make:auth
```
上記コマンドにて、Auth:認証画面が作成され、
動作する基本設定が済んでいること。


## 1. Routingの変更
```php:Routes\web.php

//変更前
//Auth::routes();
//Route::get('/home', 'HomeController@index')->name('home');

//変更後
Auth::routes(['verify' => true]); 
Route::get('/home', 'HomeController@index')->name('home')->middleware("verified");
```
######POINT
 「 ->middleware("verified"); 」を必要なルーティングに追加してください。
※メールアドレスの確認が取れてないアドレスは「メールの確認」を催促する画面が表示され続けます。


## 2. App\user.phpを変更
コード内のコメント箇所に追加・変更を記してあります。

```php:App\user.php
namespace App;
use Illuminate\Auth\MustVerifyEmail;  //追加１
use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Contracts\Auth\MustVerifyEmail as MustVerifyEmailContract;

// class User extends Authenticatable { の箇所を以下に変更2
class User extends Authenticatable implements MustVerifyEmailContract {  //変更2
    use MustVerifyEmail, Notifiable;  //MustVerifyEmailを追加

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'name', 'email', 'password',
    ];

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        'password', 'remember_token',
    ];
}
```

##３．Mail送信環境を準備
メール送信＆受信確認が必要なので
『 MAILTRAP.IO 』を使います。
mailtrap.io はSMTPを使ったメールの送信のダミーサーバーです。
詳しくは「ララ帳」ページ内の「.ENV」の章で解説してますので、以下URLをご参考に。
https://laravel10.wordpress.com/2015/02/22/%E3%83%A1%E3%83%BC%E3%83%AB%E3%81%AE%E7%92%B0%E5%A2%83%E8%A8%AD%E5%AE%9A/



## ４．サインアップ（Register）をおこなうと、以下画面が表示されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/104530/e271e506-8b3e-ef3e-6bf0-b0a0be97db75.png)
画面には登録したEmailを確認するよう表記されます。
mailtrap.io にメールが飛んでると思いますので、確認しましょう。

## ５．以下「mailtrap.io」にメールが送られて来ます。
１．画面左にメールが溜まっていきます。
２．画面右側にメール内容が表示されます。「青いボタン」クリックしてメールの承認をおこないます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/104530/de595f7d-82d4-0976-28c9-35ed7a45634c.png)



## ６． Laravel認証後画面が表示されます。
テスト的に環境を作ったので/homeがログイン後画面になっていることを御了承ください。

######メール認証がおこなわれている
![image.png](https://qiita-image-store.s3.amazonaws.com/0/104530/e2713e47-a36c-4c72-172c-d8322f61bfbc.png)

######メール認証をおこなえていない（メールを確認する催促が再度表示される）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/104530/e271e506-8b3e-ef3e-6bf0-b0a0be97db75.png)


## 備考１： Email認証後のリダイレクト先を変更
```php:/app/Http/Controllers/Auth/VerificationController.php

    /**
     * Where to redirect users after verification.
     *
     * @var string
     */
    protected $redirectTo = '/home'; //表示したいリダイレクト先に変更してください
 
```

## 備考２： 画面の日本語化

```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
                    続行する前に、電子メールで確認リンクを確認してください。メールが届かない場合は、 <a href="{{ route('verification.resend') }}">ここをクリックして別のメールをリクエストしてください</a>。
                </div>
            </div>
        </div>
    </div>
</div>
@endsection

``` 


### 感想
以外に苦戦しましたが、動作してみたら簡単だったなーと思いました。
Authの認証機能で、Emailアドレスの確認がなかったので、今後は「Email Verification」使えそうですね。早速、私のプロダクトにも活用してみようと思います。