💡

[Laravel] ログイン後にそのままその先のページにリダイレクトしたい

2023/11/17に公開

要件

  • クリックした先のページが認証を必要とするページの時、未ログインユーザーにはログイン画面を表示させる
  • ログイン後、そのままログインユーザーに表示させたかったページへと遷移する

環境

  • maxOS@12.6.8
  • PHP@8.0.28
  • Laravel@8.75

コード

use Illuminate\Support\Facades\Session;

// ...

class AuthenticatedSessionController extends Controller
{
    /**
     * Handle an incoming authentication request.
     *
     * @param  \App\Http\Requests\Auth\LoginRequest $request
     * @return \Illuminate\Http\RedirectResponse
     */
    public function store(LoginRequest $request)
    {
        $request->authenticate();
        $request->session()->regenerate();

        $intendedUrl = Session::get('url.intended', RouteServiceProvider::HOME);
        Session::forget('url.intended');

        return redirect($intendedUrl);
    }

    // ...
}

解説

上記のコードでは、Session::get('url.intended', RouteServiceProvider::HOME)でセッションに保存された直前のURLを取得し、その後、Session::forget('url.intended')でセッションからその値をクリアしています。その後、redirect()->to($intendedUrl)で取得したURLにリダイレクトしています。

Session::forget('url.intended')について

通常、redirect()->intended()は直前のURLを取得してリダイレクトする機能ですが、この機能は一度リダイレクトされた後にそのセッションの値を保持し続けます。これは、ユーザーがログイン画面などで複数回リダイレクトされることを防ぐために行われています。

しかし、通常のログイン後などでリダイレクトを行った場合、次回のリダイレクトでセッションに保存されたURLを再利用する必要はありません。そのため、リダイレクト後にそのセッションの値を削除することで、セッションが次回以降に保持されないようにします。つまり、1回のリダイレクトでのみ直前のURLを使用したい場合に利用されます。

Discussion