【Laravel 5.5】middleware authのリダイレクト先を変更する【Route [login] not defined.】

f:id:h_poppo:20180927190304p:plain

今回困ったこと

  • ルーティングでmiddleware authでログインしているユーザーのみ閲覧できるように制限した
  • ログインしていない状態でそのページにアクセスした時、デフォルトの挙動だと[login]というルート名にリダイレクトしようとする

  →ルート名を[login]以外にしたいとき(挙動を変更したい時)にどうすれば良いか。

具体的には以下のようなエラー

InvalidArgumentException
Route [login] not defined.
-----------------------------------------------
    public function route($name, $parameters = [], $absolute = true)
    {
        if (! is_null($route = $this->routes->getByName($name))) {
            return $this->toRoute($route, $parameters, $absolute);
        }
 
        throw new InvalidArgumentException("Route [{$name}] not defined.");
    }

結論

app/Exceptions/Handler.phpで、 Illuminate\Auth\AuthenticationExceptionをインポート(use)して、
Handlerクラスのunauthenticatedをオーバーライドする

app/Exceptions/Handler.php

use Illuminate\Auth\AuthenticationException;

    protected function unauthenticated($request, AuthenticationException $exception)
    {
        return $request->expectsJson()
                    ? response()->json(['message' => $exception->getMessage()], 401)
                    : redirect()->guest(route('login')); // ここを変更する
    }

middleware authってなにをしてるんだろう??

  • ログイン状態のチェックを行なっているようだ
  • OKなら、return $next($request);
  • NGなら、Unauthenticatedという例外を投げているようだ
  • 例外は、Illuminate/Foundation/Exceptions/Handler.phpでキャッチされて、function unauthenticatedで処理されているようだ

(Illuminate\Auth\Middleware\Authenticateの中で定義されているようなので、詳しくはそちらを覗いてみてください…!)