【Laravel】ログイン・新規登録後に元のURLにリダイレクトする

えび

Laravel authを使用した認証で、ログイン/新規登録後にリダイレクト元のURLに戻る実装をした

基本的にこれでOK

基本的にはLaravel側でちゃんとリダイレクトしてくれる仕組みになってる

  • routes/web.php
Route::middleware(['auth', 'verified'])->group(function () {
  // ここに書かれたルートに未認証でアクセスすると、ログイン・登録後にちゃんと戻ってくれる
});

'verified'だけだと機能しないので'auth'もちゃんと記載してあげること

それでもうまくいかない場合

  • Auth/LoginController に下記処理を追加する (メソッドもまだオーバーライドしていない場合は合わせて追加する)
    /**
     * @return \Illuminate\View\View
     */
    public function showLoginForm()
    {
        // ⭐️ 追加
        if (array_key_exists('HTTP_REFERER', $_SERVER)) {
            $path = parse_url($_SERVER['HTTP_REFERER']);
            if (array_key_exists('host', $path)) {
                if ($path['host'] == $_SERVER['HTTP_HOST']) {
                    session(['url.intended' => $_SERVER['HTTP_REFERER']]);
                }
            }
        }

        return view('auth.login');
    }

独自のMiddlewareでリダイレクトしている場合

  • Middlewareでのリダイレクト前に下記処理を追記する
<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;

class CustomeAuth
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle(Request $request, Closure $next)
    {
        if (auth()->guard('custom')->check()) {
            return $next($request);
        }
        
        // ⭐️ 追記
        session(['url.intended' => $request->url()]);

        return redirect(route('custom.auth.login'));
    }
}

メール認証後に元のURLにリダイレクトさせる場合

  • まず、Middleware/RedirectIfAuthenticatedhandleに処理を追記する
   public function handle($request, Closure $next, $guard = null)
    {
        // ⭐️ 追加
        if(session()->get("url.intended")){
            session()->put("redirect_after_email_verification", session()->get("url.intended"));
        }
        
        if (Auth::guard($guard)->check()) {
            return redirect('/mypage');
        }

        return $next($request);
    }

  • 続いて、app/Http/Controllers/Auth/VerificationController.php にredirectToメソッドを追記
    // ⭐️ 追加
   /**
     * @return mixed|string
     * @throws \Psr\Container\ContainerExceptionInterface
     * @throws \Psr\Container\NotFoundExceptionInterface
     */
    protected function redirectTo()
    {
        if (session()->get("redirect_after_email_verification")) {
            return session()->get("redirect_after_email_verification");
        }

        return $this->redirectTo;
    }

メール認証完了後のhandle()にて、
元のURLがあればそれを新しいセッション (redirect_after_email_verification)に保存 & 認証済みの場合のリダイレクト先指定にてそのセッション有無を確認するようにしている

\ 案件のご依頼・ご相談はこちらから /