Laravel5.7に更新したら、会員登録時にEメール確認リンクを送信する新機能が追加されました。設定は簡単です。
流れ
まず、どういうものか、画面で流れ追ってみましょう。
このトップ画面から始まります。
右上のRegisterのリンクをクリックすると、会員登録画面になります。
情報を入力して、Registerボタンを押すと登録完了とともに、以下のメールが送信されます。
そこで、Verify Email Addressのボタンをクリックすると、以下の画面へ遷移してEメールの確認完了です。ログアウトしているなら、ログインをして成功したら確認完了です。
設定
この設定には、コマンドラインでまず以下を実行します。
$ php artisan make:auth
この実行により会員認証関連のファイルが作成されます。
次に、routes/web.phpファイルをエディターで開き、Auth::routes(['verify' => true])
に編集します。
/* |-------------------------------------------------------------------------- | Web Routes |-------------------------------------------------------------------------- | | Here is where you can register web routes for your application. These | routes are loaded by the RouteServiceProvider within a group which | contains the "web" middleware group. Now create something great! | */ Route::get('/', function () { return view('welcome'); }); Auth::routes(['verify' => true]); Route::get('/home', 'HomeController@index')->name('home');
次に、app/User.phpを編集します。
class User extends Authenticatable implements MustVerifyEmail
と変更してインターフェースを実装します。
<?php namespace App; use Illuminate\Notifications\Notifiable; use Illuminate\Contracts\Auth\MustVerifyEmail; use Illuminate\Foundation\Auth\User as Authenticatable; class User extends Authenticatable implements MustVerifyEmail { use Notifiable; /** * 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', ]; /** * The attributes that should be cast to native types. * * @var array */ protected $casts = [ 'email_verified_at' => 'datetime', ]; }
これだけで設定完了です。
データベースの変更
このために、DBテーブル、usersに新規の項目、email_verified_atが追加されました。
会員登録時は、その項目の値は、nullです。
>>> User::find(1); => App\User {#3179 id: 1, name: "kenji", email: "kenji@example.com", email_verified_at: null, created_at: "2019-06-07 23:04:32", updated_at: "2019-06-07 23:04:32", }
しかし、Eメール確認後は、
>>> User::find(1); => App\User {#3179 id: 1, name: "kenji", email: "kenji@example.com", email_verified_at: "2019-06-07 23:10:30", created_at: "2019-06-07 23:04:32", updated_at: "2019-06-07 23:04:32", }
と確認時の日時が入ります。
Eメール確認した会員のみだけが閲覧できる
例えば、ECサイトなら、Eメールを確認した会員のみが注文ができる、とかに設定したいなら、カート画面に保護をかけることも可能です。
Route::get('cart', function () { // Eメール確認した会員のみアクセス可能 })->middleware('verified');
まだ確認してない会員には、route('verification.notice')
にレダイレクトして、Eメール確認メールの再送信を促すことも可能です。