【たった13行追加するだけ?】Laravelでログイン後の遷移先を直前の画面にする方法

IT

こんにちは。れいです。

Laravelを勉強している人「Laravelでログイン機能を実装しています。ログイン後の遷移先をログインボタンを押した時の画面にしたいのですが、どのように実装すれば良いか教えてください。」

こういった疑問に答えます。

本記事の内容

  • Laravelでログイン後の遷移先を直前の画面にする方法

記事の信頼性

  • 大手企業で3年間プログラマー経験あり

私の結論をいうと、LoginControllerを少しいじれば実装可能です。

今回の記事では、大手企業で3年間プログラマーをしていた私が、Laravelでログイン後の遷移先を直前の画面にする方法について紹介します。

本記事の想定読者

  • Laravelの勉強をしている方

記事を読むことで得られるメリット

  • Laravelでログイン後の遷移先を直前の画面にする方法を理解できる

Laravelでログイン後の遷移先を直前の画面にする方法

ログイン後の画面遷移の仕組みについて

まず、ログイン後の画面遷移の仕組みを理解しておくと良いでしょう。

make:authで作られる、app\Http\Controller\Auth\LoginController.phpでは、以下の流れでログイン後のリダイレクト先を決定しています。

  1. url.intendedの有無を確認する、あれば、その値を取り出してリダイレクトする。なければ、redirectPath()メソッドで取得したパスへリダイレクトをする。(→ 2. に進む)
  2. redirectPath()メソッドでは、redirectToメリッドの有無を確認する。あれば、そのメソッドからパスを取得する。なければ、3に進む。
  3. redirectTo変数の存在有無を確認し、あればそのパスへリダイレクトする。

make:authをしたばかりのLoginController.phpには、redirectTo変数しか定義されていないため、固定のページへの画面遷移しか出来ません。

そこで、ログイン画面を押下した際の画面のurlをurl.intendedにセットすることで、ログイン後に指定した画面にリダイレクトが可能になります。

実際の実装内容

実際のコードは以下のようになります。

app\Http\Controller\Auth\LoginController.php

public function showLoginForm()
{
    if (array_key_exists('HTTP_REFERER', $_SERVER)) {
        $path = parse_url($_SERVER['HTTP_REFERER']); // URLを分解
        if (array_key_exists('host', $path)) {
            // ホスト部分どうしで比較する。explodeでポート番号は除外する
            if ($path['host'] == explode(":",$_SERVER['HTTP_HOST'])[0]) { // ホスト部分が自ホストと同じ
                session(['url.intended' => $_SERVER['HTTP_REFERER']]);
            }
        }
    }
    return view('auth.login');
}

showLoginFormをオーバーライドし、ログイン画面を開く際の処理で、上記8行目のurl.intendedに、ログインボタンを押下した際のURLを格納することで、ログイン後にそのパスにリダイレクトしてくれます。

参考URL