Laravel Auth ログイン後のリダイレクト先をデフォルトから変更する リメイク編


目的

  • Authのログイン認証後にリダイレクトするページをデフォルトの設定から変更する方法をまとめる

環境

  • ハードウェア環境
項目 情報
OS macOS Catalina(10.15.5)
ハードウェア MacBook Pro (13-inch, 2020, Four Thunderbolt 3 ports)
プロセッサ 2 GHz クアッドコアIntel Core i5
メモリ 32 GB 3733 MHz LPDDR4
グラフィックス Intel Iris Plus Graphics 1536 MB
  • ソフトウェア環境
項目 情報 備考
PHP バージョン 7.4.8 Homebrewを用いてこちらの方法で導入→Mac HomebrewでPHPをインストールする
Laravel バージョン 8.X commposerを用いてこちらの方法で導入→Mac Laravelの環境構築を行う
MySQLバージョン 8.0.19 for osx10.13 on x86_64 Homwbrewを用いてこちらの方法で導入→Mac HomebrewでMySQLをインストールする
Node.jsバージョン v12.14.1 Homwbrewを用いてこちらの方法で導入→Mac HomebrewでNode.jsをインストールする

情報

  • 紹介する方法の動作確認はlaravel8で行ったが基本的にどのバージョンも同じ方法で実装可能であると思う。
  • 紹介するコマンドは特筆しない限り、一つ前のコマンドと同じディレクトリで実行するものとする。

条件

  • laravelアプリにAuthによる認証機能の実装がなされていること。

余談

方法

  1. laravelアプリ名ディレクトリで下記コマンドを実行してファイルを開く。

    $ vi app/Providers/RouteServiceProvider.php
    
  2. public const HOME =のようにpublicの定数を定義している部分があるのでここにログイン後にリダイレクトさせたいパスを入力する。

  3. たとえはログイン後のリダイレクトで/topにリダイレクトするように変えたいなら下記のように記載する。

    アプリ名ディレクトリ/app/Providers/RouteServiceProvider.php
    <?php
    
    namespace App\Providers;
    
    use Illuminate\Cache\RateLimiting\Limit;
    use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider;
    use Illuminate\Http\Request;
    use Illuminate\Support\Facades\RateLimiter;
    use Illuminate\Support\Facades\Route;
    
    class RouteServiceProvider extends ServiceProvider
    {
        /**
         * The path to the "home" route for your application.
         *
         * This is used by Laravel authentication to redirect users after login.
         *
         * @var string
         */
        public const HOME = '/top';
    
        /**
         * The controller namespace for the application.
         *
         * When present, controller route declarations will automatically be prefixed with this namespace.
         *
         * @var string|null
         */
        // protected $namespace = 'App\\Http\\Controllers';
    
        /**
         * Define your route model bindings, pattern filters, etc.
         *
         * @return void
         */
        public function boot()
        {
            $this->configureRateLimiting();
    
            $this->routes(function () {
                Route::prefix('api')
                    ->middleware('api')
                    ->namespace($this->namespace)
                    ->group(base_path('routes/api.php'));
    
                Route::middleware('web')
                    ->namespace($this->namespace)
                    ->group(base_path('routes/web.php'));
            });
        }
    
        /**
         * Configure the rate limiters for the application.
         *
         * @return void
         */
        protected function configureRateLimiting()
        {
            RateLimiter::for('api', function (Request $request) {
                return Limit::perMinute(60)->by(optional($request->user())->id ?: $request->ip());
            });
        }
    }
    

簡単な解説

  1. なんでapp/Providers/RouteServiceProvider.phpのHOME定数定義部分を変更することで認証後のリダイレクト先を変更できるのかを宦官に説明する。
  2. 認証後のリダイレクト処理が記載されているファイルは下記である。
    • app/Http/Middleware/RedirectIfAuthenticated.php (ミドルウェアの設定としてのリダイレクトの指示)
    • app/Http/Controllers/Auth/LoginController.php (ログイン後のリダイレクトの指示)
    • app/Http/Controllers/Auth/RegisterController.php (ユーザー登録後のリダイレクトの指示)
    • app/Http/Controllers/Auth/ResetPasswordController.php (パスワードリセット後のリダイレクトの指示)
  3. 例えばapp/Http/Middleware/RedirectIfAuthenticated.phpは下記のように記載されている。

    アプリ名ディレクトリ/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 $next($request);
        }
    }
    
  4. 上記の中でリダイレクト処理はreturn redirect(RouteServiceProvider::HOME);の部分である。

  5. redirect()はカッコの中で指定されたパスにリダイレクトするlaravelのヘルパ関数である。(公式ドキュメントhttps://readouble.com/laravel/8.x/ja/helpers.html#method-redirect

  6. RouteServiceProvider::HOMEはRouteServiceProviderクラスのHOMEプロパティを呼び出している。(クラスプロパティとか性的プロパティとか言われる。 筆者が書いた簡単な解説→https://qiita.com/miriwo/items/974adcee45f699553cd4

  7. だからアプリ名ディレクトリ/app/Providers/RouteServiceProvider.phpで定義されているHOME定数を変えてあげることでリダイレクト先の設定が根底から変わり「RedirectIfAuthenticated.php」「LoginController.php」「RegisterController.php」「ResetPasswordController.php」の個々のリダイレクト処理を書き換えなくて良いということ。(各ファイルでアプリ名ディレクトリ/app/Providers/RouteServiceProvider.phpで定義されているHOME定数を使用してリダイレクト処理を記載しているから)

  8. よって前に筆者が書いた下記の記事はよくない記事だった。