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からルーティングの記載方法が変わっているので注意すること。

# 方法

- 下記のようなルーティング情報がルーティングファイルに記載されていたとする。

    ```アプリ名ディレクトリ/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;
    use App\Models\Memo;

    /*
    |--------------------------------------------------------------------------
    | 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::get('/workspace/register', [WorkspaceController::class, 'register'])->middleware(['auth'])->name('workspace.register');
    Route::post('/workspace/save', [WorkspaceController::class, 'save'])->middleware(['auth'])->name('workspace.save');
    Route::get('/workspace/detail/task/{workspace_id}', [WorkspaceController::class, 'taskDetail'])->middleware(['auth'])->name('workspace.task.detail');
    Route::get('/workspace/detail/memo/{workspace_id}', [WorkspaceController::class, 'memoDetail'])->middleware(['auth'])->name('workspace.memo.detail');
    ```

- 上記ファイルにはいくつか冗長性があるが、まずは各ルーティング情報のURL指定部分の`/workspace`の部分をプレフィックスを用いてまとめて記載してみる。

    ```アプリ名ディレクトリ/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;
    use App\Models\Memo;

    /*
    |--------------------------------------------------------------------------
    | 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')->group(function() {
        Route::get('/register', [WorkspaceController::class, 'register'])->middleware(['auth'])->name('workspace.register');
        Route::post('/save', [WorkspaceController::class, 'save'])->middleware(['auth'])->name('workspace.save');
        Route::get('/detail/task/{workspace_id}', [WorkspaceController::class, 'taskDetail'])->middleware(['auth'])->name('workspace.task.detail');
        Route::get('/detail/memo/{workspace_id}', [WorkspaceController::class, 'memoDetail'])->middleware(['auth'])->name('workspace.memo.detail');
    });
    ```

- 上記の様に`prefix()`メソッドと`group()`メソッドを用いることでURLの共通部分を一括指定する事ができる。
- 下記に簡単に例を記載しておく。

    ```アプリ名ディレクトリ/routes/web.php
    Route::prefix('URLの最初のフィールドの共通部分')->group(function() {
        //グループ化したいルーティング情報
    });
    ```

# ルートネームの一括設定をしたい場合

- https://qiita.com/miriwo/items/4578de6e748cffe59019

# 参考文献

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