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

- 上記ファイルにはいくつか冗長性があるが、各ルーティング名の`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;
    
    /*
    |--------------------------------------------------------------------------
    | 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');
    });
    ```

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

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

# 参考文献

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