Laravelで未ログイン状態でアクセスされたらログインさせてから元の場所に戻す方法

こんにちは、さるまりんです。

Webサイト上でログインしないとアクセスできないエリアがあります。この中のURLに未ログイン状態でアクセスされた時にまずログインさせてから、元々行きたかったURLにリダイレクトしたい時があります。
今回はそれをLaravel上でやっていますので残しておきます。
標準の認証で使われるauthミドルウェアを使って実現しています。

1. Authenticatedミドルウェア

AuthenticatedミドルウェアのredirectTo()メソッドで、ログインしていなければ指定されたURL(アクセスしたいURL)をセッションにとっておきます。

こんなコードです。

class Authenticate extends Middleware
{
    // いろいろあって...

    // ここです
    protected function redirectTo($request)
    {
        $uri = $request->getUri();
        if (! $request->expectsJson()) {

            // セッションにリクエストURLを保存
            session()->put('url.intended', url()->current());

            return route('login');
        }
    }

}

2. LoginControllerコントローラー

セッションからリクエストされたURLがあればそこにリダイレクトします。

protected function authenticated(Request $request, $user)
{
    // セッションからリダイレクト先URLを取得
    $redirectUrl = session()->pull('url.intended', '/');
    return redirect()->intended($redirectUrl); // 認証後にリダイレクト
}

3. ルートの設定

ルートで認証で保護するURLにauthミドルウェアを指定する。

いろいろ書き方はあると思いますが↓のような感じです。

Route::get('/mypage', 'MypageController@index')->name('mypage')->middleware('auth');

MyPageControllerindex()でアクセスされる/mypage(マイページ)は認証後でないと表示できないようにしています。

4. RedirectIfAuthenticatedミドルウェア

これはいるかどうかですが、ログインしている状態でログイン画面にアクセスした時はトップにリダイレクトするようにもしています。

public function handle($request, Closure $next, $guard = null)
{
    if (Auth::guard($guard)->check()) {
        return redirect('home'); // リダイレクト先をトップページに設定
    }

    return $next($request);
}

他にもいろいろやり方があるんでしょうね。ケースにあった実装ができるように知識を増やしたいです。

読んでくださってありがとうございました。

それではまた!