【Laravel】/routes以下のみで完結するお手軽ルーティングファイル分割

  • 2022年1月7日
  • 2022年1月10日
  • PHP

 Laravel は PHP のフレームワークでその性質上 web サイトや web アプリケーションの開発によく使われます。この web を介して何かを作る時、URL とプログラムの紐づけであるルーティングを定義することになります。Laravel のルーティングは次の様に定義できます。
ルーティング 8.x Laravel

use App\Http\Controllers\UserController;

Route::get('/user', [UserController::class, 'index']);
Route::get('/user', UserController::class. '@index');

 URL とメソッドを 1:1 で対応させます。また記述できるものには name, prefix, group, middleware など色々あり、実際には次の様なルーティング定義になります。

Route::middleware('auth:admin_web')
    ->where(
        [
            'adminId'  => '\d+',
            'memberId' => '\d+',
        ]
    )->group(static function () {
        Route::name('member.')
            ->prefix('member')
            ->namespace('Member')
            ->group(static function () {
                Route::middleware(会員をどうこうする管理者権限ミドルウェアなど)
                    ->group(static function () {
                        Route::get('', 'MemberController@search')->name('search');
                        // ここから会員管理についてルーティング多数
                });
            });
    });

 具体的な処理内容は割愛します。要は記述量が増えやすいということです。ある程度の規模になると総計して 1000 行はざらに超えるため 1 ファイルではとても見れたものでないです。何かあるたび文字列検索で探すはめになります。これの対処としてルーティング定義のファイルを分割する方法があります。
 ルーティング定義のファイルを分割し増やす方法ですが王道は RouteServiceProvider(Laravel のバージョンによっては RoutingServiceProvider) に定義を増やしていく方法です。RouteServiceProvider は次の様な記述があり、ここでどのファイルのルーティング定義をどの様に使うか定義しています。
laravel/RouteServiceProvider.php at 8.x · laravel/laravel

    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'));
        });
    }

 とはいえ /routes 以下で完結させたいという動機が起きる場合もあります。一々 RouteServiceProvider.php を呼び出したり、追記したりが面倒であったり glob の書き方に確証がなかったりする時とかそういう時です。そういう時は次の様な書き方ができます。

// admin.php
// 各ルーティング定義ファイルを読み込むファイル。これを RouteServiceProvider に読み込ませる
Route::middleware('auth:admin_web')
    ->where(
        [
            'adminId'  => '\d+',
            'memberId' => '\d+',
        ]
    )->group(static function () {
        include __DIR__.'/admin/member.php';
        // そのほか admin 配下のルーティングをまとめたファイルの include 多数
    }):


// admin/member.php
// 会員管理についてのルーティングのみをまとめたファイル
Route::name('member.')
    ->prefix('member')
    ->namespace('Member')
    ->group(static function () {
        Route::middleware(会員をどうこうする管理者権限ミドルウェアなど)
            ->group(static function () {
                Route::get('', 'MemberController@search')->name('search');
                // ここから会員管理についてルーティング多数
        });
    });

 include でルーティング定義ファイルを呼び出します。とりあえず include にしましたが include_once でも require でも正常動作は同じです。
PHP: include – Manual
 include は指定した先のファイルの記述が include された箇所にあるようにふるまいます。このため大量のルーティング記述をパパっと分けるならば上記の様に複数ファイルに分割して元々あった根元のルーティングファイルで分割した各ファイルを include するのが手軽です。

>株式会社シーポイントラボ

株式会社シーポイントラボ

TEL:053-543-9889
営業時間:9:00~18:00(月〜金)
住所:〒432-8003
   静岡県浜松市中央区和地山3-1-7
   浜松イノベーションキューブ 315
※ご来社の際はインターホンで「316」をお呼びください

CTR IMG