Laravel
laravel5.6

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


今回困ったこと


  • ルーティングで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の中で定義されているようなので、詳しくはそちらを覗いてみてください…!)