背景
Laravel 6.x LTSを使っていて、以下の手順でメール認証機能を導入した。
導入した後、Bladeテンプレート側に書いてた @auth
や @guest
をメール確認済みかどうかで分岐させたいとき、どう書けばいいんだろうか? となった。ドキュメントには特に何も書かれていなかったので自分で実験して調べてみた、という記録。
※なお執筆時点で最新のLaravel 8.xはまた全然違うものになってるようなので、これはあくまでもLaravel 6.x向けであることを最初に補足しておく。でも6.xはLTSなのでしばらくは有用なはず……。
まず結論
元の記述
※resources\views\layouts\app.blade.php
などにも最初からある記述
@guest
// 未ログイン状態の処理
@else
// ログイン状態の処理
@endguest
修正後
@if(!Auth::check())
// 未ログイン状態の処理
@elseif(Auth::user() && !Auth::user()->hasVerifiedEmail())
// ログイン状態の処理(メール確認が済んでいないがメアドとパスを入力した状態)
@else
// ログイン状態の処理(メール確認済み)
@endif
解説
元の @auth
や @guest
は使えなくなるのか
修正前の記述も、これはこれで使用可能ではある。
しかし元の @auth
や @guest
ではメール確認が済んでいるかどうかの判別が出来ず、いっしょくたに「ログイン済みかどうか」だけで判断されてしまうのである。
@guest
// 未ログイン状態の処理
@else
// ログイン状態の処理(★メール確認を済ませてない人を含む)
@endguest
※ @auth
~ @endauth
の場合は上記の条件がひっくり返っただけ。
もちろん元の記述で問題ないならそれで良い。
でもメール確認が済んでいるかどうかも区別するには、結論に書いたような表現をする必要がある、ということの模様。
Laravelの用意してる認証機能は、内部的には「メール確認が済んでいなくてもログイン自体は出来る」という仕様のようですね。メール認証が済んでいないとログイン自体出来ないサービスが多い印象なので、つい勘違いしてしまいがちですが。
ログアウトボタンを見せる条件
ではこのとき、ナビゲーションバーなどでログアウトボタンを見せるべき条件はどうなるかというと、これは従来の @auth
の条件と変わっていない。メール確認が済んでいないユーザーであろうとログインはログインということのようなので。
結論に書いた条件文で言えば、ログイン/ログアウトボタンは以下のように用意してあげる必要がある。
@if(!Auth::check())
// 未ログイン状態なので、ログインボタンが欲しい
@elseif(Auth::user() && !Auth::user()->hasVerifiedEmail())
// メール確認済んでないけどログイン済みなので、ログアウトボタンが欲しい
@else
// メール確認済みでログイン済みなので、ログアウトボタンが欲しい
@endif
真ん中の場合が直感的に分かりづらいけど、まあそういうものなので。
おまけ
認証機能で用意されているメールをカスタマイズしたい場合は、手前味噌だけど以下の記事を参照。