【Laravel】ルートのグループ化。Route::groupメソッドの役割について。（prefixとnameメソッドも））

Laravelのルートファイルで頻繁に登場する`Route::group`の意味について。

**▼こういうの**

```php:web.php
Route::group(['prefix' => 'topics', 'as' => 'topics.'], function() {
        Route::get('/', 'TopicController@index')->name('index');
        Route::get('{filename}.html', 'TopicController@show')->name('show');
    });
```

<br>
##目次

1. [`Route::group`の意味](#routegroupの意味)
2. [実例](#実例)
3. [コントローラアクションの場合](#コントローラアクションの場合)
4. [ミドルウェアを適用する場合](#ミドルウェアを適用する場合)
5. [prefixメソッド](#prefixメソッド)
6. [nameメソッド](#nameメソッド)



<br>
##`Route::group`の意味
Routeファサードのgroupメソッドを呼び出している。
このメソッドで、**URIの接頭部**や**名前空間の接頭部**を共通化できる。

類似した**ルートを複数記述する場合に便利なメソッド**。

groupメソッドの前に別のメソッドがきて、チェーンでつなぐパターンもある。

・例：`Route::middleware()->group();`

<br>
##groupメソッドの構文

```php:
group(['prefix' => '共通するURI', 'as' => '共通するルート名' ]{ Route::get(); Route::get();,,,  })
```

`prefix`と`as`はどちらか一方、あるいはどちらも無しでも作動する。


<br>
##実例
view/topicsディレクトリに、index, show, detailの３つのビューがある場合

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563526/2713fa8e-6472-ddba-6abc-830d51efcb60.png)


###通常のルーティング
それぞれのルートを作成する場合は以下のようになる。

```php:
Route::get('topics', function () { return view('topics.index'); })->name('topics.index');
Route::get('topics/show', function () { return view('topics.show'); })->name('topics.show');
Route::get('topics/detail', function () { return view('topics.detail'); })->name('topics.detail');
```

ここでは、URIの`topics`と、ルート名(nameメソッド)の`topics.`が共通。

↓ グループ化

```php:
Route::group(['prefix' => 'topics', 'as' => 'topics.'], function() {
    Route::get('/', function () { return view('topics.index'); })->name('index');
    Route::get('show', function () { return view('topics.show'); })->name('show');
    Route::get('detail', function () { return view('topics.detail'); })->name('detail');
});
```

groupメソッドを使うと表記を省略できる。グルーピングできるので視認性も向上する。




<br>
###コントローラアクションの場合

```php:
Route::get('topics', 'TopicsController@index' )->name('topics.index');
Route::get('topics/show', 'TopicsController@show' )->name('topics.show');
Route::get('topics/detail', 'TopicsController@detail' )->name('topics.detail');
```

↓ グループ化

```php:
Route::group(['prefix' => 'topics', 'as' => 'topics.'], function() {
    Route::get('/', 'TopicsController@index' )->name('index');
    Route::get('show', 'TopicsController@show' )->name('show');
    Route::get('detail', 'TopicsController@detail' )->name('detail');
});
```



<br>
##ミドルウェアを適用する場合

```php:
Route::group(['middleware' => 'auth.very_basic'], function () {
    Route::get('/', function () {
        //
    });

    Route::get('/user/profile', function () {
        //
    });
});
```


<br>
middlewareメソッドを使って、groupメソッドをチェーンすることもできる。

```php:
Route::middleware(['first', 'second'])->group(function () {
    Route::get('/', function () {
        //
    });

    Route::get('/user/profile', function () {
        //
    });
});
```

上記例のgroupはprefixやnameの指定がないバージョン。指定したミドルウェアを適用するために個別にルートをまとめる時はこのような記述になる。

[ミドルウェアとは？](https://qiita.com/drafts/5e050bf07b2257a6a1d7)


<br>
##prefixメソッド
prefixメソッドで共通するURIを記述してから、groupに適用する方法もある。

・`prefix('共通するURI接頭部')`

```php:
Route::prefix('topics')->group(['as' => 'topics.'], function() {
    Route::get('/', 'TopicsController@index' )->name('index');
    Route::get('show', 'TopicsController@show' )->name('show');
    Route::get('detail', 'TopicsController@detail' )->name('detail');
});
```


##nameメソッド
naemメソッドで共通するルート名を記述してから、groupに適用する方法もある。

・`prefix('共通するURI接頭部')`

```php:
Route::name('topics.')->group(['prefix'=>'topics'], function() {
    Route::get('/', 'TopicsController@index' )->name('index');
    Route::get('show', 'TopicsController@show' )->name('show');
    Route::get('detail', 'TopicsController@detail' )->name('detail');
});
```


###prefixメソッドとnameメソッドをチェーンする
各メソッドのチェーニングも可能。

```php:
Route::name('topics.')->group(['prefix'=>'topics'], function() {
    Route::get('/', 'TopicsController@index' )->name('index');
    Route::get('show', 'TopicsController@show' )->name('show');
    Route::get('detail', 'TopicsController@detail' )->name('detail');
});
```