びくんびくんしながらコードを書く。

いしきひくい系エンジニアのらくがき帳

Laravel 5.5 未ログイン状態でログイン必須ページを開いたときのリダイレクト先を変更する。

未ログインユーザがログイン必須ページを開いたときに特定のページにリダイレクトしたいという場面はよくあることだと思います。
大抵はログイン画面に遷移してログインさせるとかだと思いますが、ログイン画面ではなく、TOPページに遷移させたくなりました。

ページ数が少なければ各コントローラでログイン確認をすればいいと思うのですが、ログイン必須ページが多くなりそうだったのでRoute::groupでどうにかできないかやってみました。

詰まったところ

Route::group(['middleware'=>['auth']]) でくくればいいのかな?と思って軽くやってみたのですが、loginなんてroutingねーから!と言われてエラーになってしまった。

解決策

teratileに解決のヒントが有りました。 PHP - Laravel 5.3 認証してない場合のリダイレクト先(48708)|teratail

ログインしていない場合は AuthenticationException が投げられる。
受け取り口は unauthenticated になる。
つまりExceptionHandlerにそのへんを追加してやれば良さそうです。

実際どうしたか

下記ファイルにmethod追加して事なきを得ました。 app/Exceptions/Handler.php

追加するmethod

use Illuminate\Auth\AuthenticationException;

class Handler extends ExceptionHandler
{
~~~中略~~~

//このmethodを追加
    public function unauthenticated($request, AuthenticationException $exception){
        return redirect()->guest('/');
    }

}

そのまま読んでくれるかと思って引数を ($request, Illuminate\Auth\AuthenticationException $exception) としてみましたがこれはうまくいきませんでした。
なんでだろ?

最後に

上記解決方法が正しいかどうかと言うのは正直確実に正しいです!と言い切る自信がありません。
ただ、私はこの方法で解決できましたというだけなのでその点はただただコピペするだけではなく考えていただければと思います。
こっちのほうがいいよ!という実装方法があればぜひ教えてください!

以上