概要
Webサービスでアカウントを作成する時、メールアドレスの確認メールが届く。
Laravel 5.7から、この確認メールを送信する機能が追加されたそうなので、試してみる。
参考: readouble.com メール確認
##▼ 動作確認環境
- PHP 7.1.21
- Laravel 5.7
##▼ 前提
php artisan make:auth
で、アカウント作成・ログイン機能・パスワードリマインダーがすでに準備されていることが前提です。
設定していこう
##▼ 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 MustVerifyEmail, Notifiable;
}
MustVerifyEmail
に対してas MustVerifyEmailContract
という風にエイリアスを設定しているのは、クラス内で追加している use MustVerifyEmail ...
のトレイトと名前が競合しないようにするため。
##▼ routes/web.php を編集する
- Auth::routes();
+ Auth::routes(['verify' => true]);
動作確認
この時点でアカウント作成を試してみます。
画面には「ログインしました!」という表示。
メールはちゃんと届きました。
メールアドレスが有効かどうか確認することと、アカウントを作成することとは別です。
そのため上のような状況になり、
この段階でも記事の投稿などができてしまいます。
これを防ぐために、middlewareのverifiedを使います。
これを使うことで、メールアドレスが確認済みの場合のみ投稿ができるようにします。
修正する
##▼ ルーティングを修正する
メールアドレス未確認にもかかわらず「ログインしました!」となってしまう点から修正したいので、まずルーティングを修正します。
参考: readouble.com 保護下のルート
->middleware('verified')
を設定しておきます。
こうすることで、メール確認が済んでいない状態でhomeにアクセスされた場合は
email/verify にリダイレクトするようになります。
Route::get('/home', 'HomeController@index')->middleware('verified');
このように設定してからアカウント作成を試すと、画面はこのようになってくれます。
##▼ 記事の投稿に制限をかける
###- route/web.php で修正する方法
記事を投稿したり編集・削除する時にもverifiedを使いたいです。
以下の要領で全部に->middleware('verified')
をつけてもいいのですが、
ちょっと手間です。
Route::post('/posts', 'PostsController@create')
->middleware('verified');
Route::post('/posts', 'PostsController@store')
->middleware('verified');
###- コンストラクタで対応する方法
__construct()
の中に書くことで
「基本的にverifiedが必要、ただしindexとshowを除く」とできます。
public function __construct()
{
$this->middleware('verified')->except(['index', 'show']);
}
UserControllerは少し変えます。
メールアドレスの確認が完了していなくても、退会だけはできるようにします。
※ ->middleware('verified')
はログイン中でメアドの確認が完了済み
->middleware('auth')
はログイン中でメアドの確認が未完了
public function __construct()
{
$this->middleware('auth')->only('destroy');
$this->middleware('verified')->except(['index', 'show', 'destroy']);
}
Email Verification が終わった時の飛び先
届いたメール中のボタンをクリックした時、飛び先はデフォルトで/home になっていると思います。
これをカスタマイズします。
##▼ 飛び先を変える
ここが/home となっているので /verified という風にしてみます。
/**
* Where to redirect users after verification.
*
* @var string
*/
protected $redirectTo = '/verified';
##▼ route/web.php
verifiedに行くにはもちろん->middleware('verified')
が必要です。
Route::get('/verified', function(){
return view('auth.verified');
})->middleware('verified');
##▼ Viewを作る
resources/views/auth/verified.blade.phpを新しく作ります。
@php
$title = __('You\'ve verified your email address.');
@endphp
@extends('layouts.myapp')
@include('layouts.header')
@section('content')
<div class="container">
<div class="row justify-content-center">
<div class="col-md-8">
<div class="card">
<div class="card-header">{{ __('You\'ve verified your email address.') }}</div>
<div class="card-body">
{{ __('Let\'s get started.') }}
</div>
</div>
</div>
</div>
</div>
@endsection
##▼ ja.jsonに追記
"You've verified your email address.":"メールアドレスの確認が完了しました。",
"Let's get started.":"さっそく始めてみましょう。"
これで完成。
verified.blade.phpには、初めてサービスを利用する人向けのTIPSなど表示できると良さそうです。
参考
【Laravel 5.7】新たにメールアドレスの確認機能(Email Verification)が追加。使い方と仕組みを紹介します。