LoginSignup
6
7

More than 3 years have passed since last update.

Laravelでログイン後に元のページに戻る

Posted at

やりたいこと

LaravelにおいてJetStreamによるログイン機能を使う際、何もしないとログイン後に固定のページ(/dashboard)に飛ばされてしまいます。

以下、私が実際に検証したログイン後に元居たページに戻る方法の実装です(他にもっと良い方法があれば教えてください)。

Laravel 7 の場合

LoginControllershowLoginForm()をオーバーライドすることで実現できました。

app/Http/Controllers/Auth/LoginController.php
<?php

namespace App\Http\Controllers\Auth;

use App\Http\Controllers\Controller;
use App\Providers\RouteServiceProvider;
use Illuminate\Foundation\Auth\AuthenticatesUsers;

class LoginController extends Controller
{
    /*
    |--------------------------------------------------------------------------
    | Login Controller
    |--------------------------------------------------------------------------
    |
    | This controller handles authenticating users for the application and
    | redirecting them to your home screen. The controller uses a trait
    | to conveniently provide its functionality to your applications.
    |
    */

    use AuthenticatesUsers;

    /**
     * Where to redirect users after login.
     *
     * @var string
     */
    protected $redirectTo = RouteServiceProvider::HOME;

    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware('guest')->except('logout');
        // $this->redirectTo = url()->previous();
    }
    // ▼▼▼ 新規追加 オーバーライドする ▼▼▼
    public function showLoginForm()
    {
        if (!session()->has('url.intended')) {
            session(['url.intended' => url()->previous()]);
        }
        return view('auth.login');
    }
    // ▲▲▲ 新規追加 オーバーライドする ▲▲▲
}

参考

Laravel 8 の場合

LoginControllerが作成されないため、Laravel 7 自前のコントローラを用意するみたいです。

LoginController

LoginControllerを自作します。
名称は任意です。通常のコントローラと同じ扱いです。
JetStreamで用意された/loginの前に、遷移前URLをセッションに保持してからリダイレクトしています。

app/Http/Controllers/Auth/LoginController.php
<?php

namespace App\Http\Controllers;

class LoginController extends Controller
{
    public function index()
    {
        if (!session()->has('url.intended')) {
            session(['url.intended' => url()->previous()]);
        }
        return redirect('login');
    }
}

web.php

上記LoginControllerにアクセスするためのルート登録します。

routes/web.php
<?php

use App\Http\Controllers\LoginController;
use Illuminate\Support\Facades\Route;

// 中略
Route::get("/my-login", [LoginController::class, "index"])->name("myLogin");

Authenticate.php

認証先のURLを自前のログイン用URLに書き換えます。

app/Http/Middleware/Authenticate.php
<?php

namespace App\Http\Middleware;

use Illuminate\Auth\Middleware\Authenticate as Middleware;

class Authenticate extends Middleware
{
    /**
     * Get the path the user should be redirected to when they are not authenticated.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return string|null
     */
    protected function redirectTo($request)
    {
        if (! $request->expectsJson()) {
            // return route('login'); // 変更前
            return route('myLogin'); // 変更後
        }
    }
}

RedirectIfAuthenticated.php

認証後のリダイレクト先を書き換えます。
redirect()->intended($path)という方法で、上記LoginControllerでセッションに保存した遷移前のURLに遷移できるようです。

app/Http/Middleware/RedirectIfAuthenticated.php
<?php

namespace App\Http\Middleware;

use App\Providers\RouteServiceProvider;
use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;

class RedirectIfAuthenticated
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @param  string|null  ...$guards
     * @return mixed
     */
    public function handle(Request $request, Closure $next, ...$guards)
    {
        $guards = empty($guards) ? [null] : $guards;

        foreach ($guards as $guard) {
            if (Auth::guard($guard)->check()) {
                // return redirect(RouteServiceProvider::HOME); // ←変更前
                return redirect()->intended(RouteServiceProvider::HOME);  // ←変更後
            }
        }

        return $next($request);
    }
}

その他ログイン先のリンク変更

例えば、resources/views/navigation-menu.blade.phpなどで定義されているルート名を書き換えます。
href="{{ route('login') }}href="{{ route('myLogin') }}

参考

6
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
7