Laravelのルートファイルで頻繁に登場するRoute::group
の意味について。
▼こういうの
web.php
Route::group(['prefix' => 'topics', 'as' => 'topics.'], function() {
Route::get('/', 'TopicController@index')->name('index');
Route::get('{filename}.html', 'TopicController@show')->name('show');
});
##目次
##`Route::group`の意味 Routeファサードのgroupメソッドを呼び出している。 このメソッドで、**URIの接頭部**や**名前空間の接頭部**を共通化できる。
類似したルートを複数記述する場合に便利なメソッド。
groupメソッドの前に別のメソッドがきて、チェーンでつなぐパターンもある。
・例:Route::middleware()->group();
##groupメソッドの構文
group(['prefix' => '共通するURI', 'as' => '共通するルート名' ]{ Route::get(); Route::get();,,, })
prefix
とas
はどちらか一方、あるいはどちらも無しでも作動する。
##実例 view/topicsディレクトリに、index, show, detailの3つのビューがある場合
###通常のルーティング
それぞれのルートを作成する場合は以下のようになる。
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.
が共通。
↓ グループ化
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メソッドを使うと表記を省略できる。グルーピングできるので視認性も向上する。
###コントローラアクションの場合
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');
↓ グループ化
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');
});
##ミドルウェアを適用する場合
Route::group(['middleware' => 'auth.very_basic'], function () {
Route::get('/', function () {
//
});
Route::get('/user/profile', function () {
//
});
});
middlewareメソッドを使って、groupメソッドをチェーンすることもできる。
Route::middleware(['first', 'second'])->group(function () {
Route::get('/', function () {
//
});
Route::get('/user/profile', function () {
//
});
});
上記例のgroupはprefixやnameの指定がないバージョン。指定したミドルウェアを適用するために個別にルートをまとめる時はこのような記述になる。
##prefixメソッド prefixメソッドで共通するURIを記述してから、groupに適用する方法もある。
・prefix('共通するURI接頭部')
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接頭部')
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メソッドをチェーンする
各メソッドのチェーニングも可能。
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');
});