🤩

Laravel11・Breeze ログインしたら、ログイン前のページに戻る

2025/02/05に公開

良く実装するコードなので備忘録.
Laravel11・Breezeを実装済みのBladeのケース。

ログイン前のURLを保存する

まず、ログインページにアクセスするその直前のURLをセッションに保存します。
AuthディレクトリのAuthenticatedSessionControllerのcreateで行います。

AuthenticatedSessionController.php
use Illuminate\Http\Request;
use Illuminate\Support\Facades\URL;

public function create(Request $request)
{
    if (! $request->session()->has('url.intended')) {
        $request->session()->put('url.intended', URL::previous());
    }

    return view('auth.login');
}

但し、URL::previous()はブラウザの履歴に依存するので、ユーザーが戻るボタンを使ってログインページに入った場合はURLが取得できないこともあります。

ログイン後のリダイレクト先の変更

通常、ログイン後はdashboardにリダイレクトするように書かれています。
これをセッションに保存したURLにリダイレクトするように変更します。
AuthディレクトリのAuthenticatedSessionControllerのstoreで行います。

AuthenticatedSessionController.php
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Validation\ValidationException;

public function store(LoginRequest $request): RedirectResponse
{
    $request->authenticate();

    $request->session()->regenerate();

    if ($request->session()->has('url.intended')) {
        $intendedUrl = $request->session()->pull('url.intended');
        return redirect()->intended($intendedUrl);
    }

    return redirect()->intended(route('dashboard', absolute: false));
}

$request->session()->has('url.intended') でセッションに保存したURLが存在すればそのURLにリダイレクトし、無ければ通常のdashboardにリダイレクトします。

セキュリティ上、必要に応じて、リダイレクト先がアプリ内のURLかどうか判定するメソッドもつけて実装してください。
一例のコードを載せておきます。

php
    private function isAppUrl($url)
    {
        $parsedUrl = parse_url($url);

        // ホストが存在して現在のアプリのホストと一致するか確認
        if (isset($parsedUrl['host'])) {
            return $parsedUrl['host'] === parse_url(URL::current())['host'];
        }

        // ホストが存在しない場合は、パスのみのURLとみなしてアプリ内と判定
        return true;
    }

parse_urlでURLを解析し、正誤判定を返します。

Discussion