laravel 複数のルーティング情報に一括してミドルウェアの設定を行う

# 目的

- いくつかのルーティング情報に一括してミドルウェアの設定を行う方法をまとめる

# 環境

- ハードウェア環境

| 項目 | 情報 |
| --- | --- |
| 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をインストールする](https://qiita.com/miriwo/items/cd54077aad7e139cf518) |
| Laravel バージョン | 8.X | commposerを用いてこちらの方法で導入→[Mac Laravelの環境構築を行う](https://qiita.com/miriwo/items/adaaaeecae69d6392e08) |
| MySQLバージョン | 8.0.19 for osx10.13 on x86_64 | Homwbrewを用いてこちらの方法で導入→[Mac HomebrewでMySQLをインストールする](https://qiita.com/miriwo/items/ef6a064bc545fbea29d9) |
| Node.jsバージョン | v12.14.1 | Homwbrewを用いてこちらの方法で導入→[Mac HomebrewでNode.jsをインストールする](https://qiita.com/miriwo/items/73d1546220f1c091a7d5) |

# 情報

- 筆者は動作確認をlaravel8を用いて行ったが、今回紹介するルーティング記載方法はlaravel6でも一緒である。
- laravel8からルーティングの記載方法が変わっているので注意すること。

# 方法

- 下記のようなルーティング情報がルーティングファイルに記載されていたとする。このアプリケーションはAuthによる認証機能が実装されている。

    ```アプリ名ディレクトリ/routes/web.php
    <?php
    
    use Illuminate\Support\Facades\Route;
    use App\Http\Controllers\TopController;
    use App\Http\Controllers\WorkspaceController;
    use App\Http\Controllers\TaskController;
    use App\Http\Controllers\MemoController;
    
    /*
    |--------------------------------------------------------------------------
    | Web Routes
    |--------------------------------------------------------------------------
    |
    | Here is where you can register web routes for your application. These
    | routes are loaded by the RouteServiceProvider within a group which
    | contains the "web" middleware group. Now create something great!
    |
    */
    
    Route::get('/', function () {
        return view('welcome');
    });
    
    Route::get('/dashboard', function () {
        return view('dashboard');
    })->middleware(['auth'])->name('dashboard');
    
    require __DIR__.'/auth.php';
    
    Route::get('/top', [TopController::class, 'index'])->middleware(['auth'])->name('top.index');
    
    // ワークスペース系
    Route::prefix('workspace')->name('workspace.')->group(function () {
        Route::get('/register', [WorkspaceController::class, 'register'])->middleware(['auth'])->name('register');
        Route::post('/save', [WorkspaceController::class, 'save'])->middleware(['auth'])->name('save');
        Route::get('/detail/task/{workspace_id}', [WorkspaceController::class, 'taskDetail'])->middleware(['auth'])->name('task.detail');
        Route::get('/detail/memo/{workspace_id}', [WorkspaceController::class, 'memoDetail'])->middleware(['auth'])->name('memo.detail');
    });
    ```

- ルーティング情報に`->middleware(['auth'])`のようにしてミドルウェアが指定されている。各ルーティング情報にバラバラに記載されているため、非常に冗長である。
- 下記のようにしてミドルウェアの記載をまとめる事ができる。

    ```アプリ名ディレクトリ/routes/web.php
    <?php
    
    use Illuminate\Support\Facades\Route;
    use App\Http\Controllers\TopController;
    use App\Http\Controllers\WorkspaceController;
    use App\Http\Controllers\TaskController;
    use App\Http\Controllers\MemoController;
    
    /*
    |--------------------------------------------------------------------------
    | Web Routes
    |--------------------------------------------------------------------------
    |
    | Here is where you can register web routes for your application. These
    | routes are loaded by the RouteServiceProvider within a group which
    | contains the "web" middleware group. Now create something great!
    |
    */
    
    Route::get('/', function () {
        return view('welcome');
    });
    
    Route::get('/dashboard', function () {
        return view('dashboard');
    })->middleware(['auth'])->name('dashboard');
    
    require __DIR__.'/auth.php';
    
    Route::get('/top', [TopController::class, 'index'])->middleware(['auth'])->name('top.index');
    
    // ログイン必須ページ
    Route::middleware('auth')->group(function() {
        // ワークスペース系
        Route::prefix('workspace')->name('workspace.')->group(function () {
            Route::get('/register', [WorkspaceController::class, 'register'])->name('register');
            Route::post('/save', [WorkspaceController::class, 'save'])->name('save');
            Route::get('/detail/task/{workspace_id}', [WorkspaceController::class, 'taskDetail'])->name('task.detail');
            Route::get('/detail/memo/{workspace_id}', [WorkspaceController::class, 'memoDetail'])->name('memo.detail');
        });
    });
    ```

- 上記の様に`middleware()`メソッドと`group()`メソッドを用いることでミドルウェアを一括指定する事ができる。
- 下記に簡単に例を記載しておく。

    ```アプリ名ディレクトリ/routes/web.php
    Route::middleware('ミドルウェア名')->group(function() {
        //グループ化したいルーティング情報
    });
    ```

# 参考文献

- [https://readouble.com/laravel/6.x/ja/routing.html](https://readouble.com/laravel/6.x/ja/routing.html)