Help us understand the problem. What is going on with this article?

Laravel 6.xでのメール認証機能導入後のBladeテンプレートの分岐処理

背景

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

真ん中の場合が直感的に分かりづらいけど、まあそういうものなので。

おまけ

認証機能で用意されているメールをカスタマイズしたい場合は、手前味噌だけど以下の記事を参照。

daijin
しがないゲーマー。三度の飯よりゲームが好き。DTMとかときどきする。本業はC/C++で何か作ってたけど、最近はラズパイとかLaravelとか触ってる。Unityも始めました。
https://www.zephyr-cradle.info/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away