Help us understand the problem. What is going on with this article?

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

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


目次

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


Route::groupの意味

Routeファサードのgroupメソッドを呼び出している。
このメソッドで、URIの接頭部名前空間の接頭部を共通化できる。

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

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

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


groupメソッドの構文

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

prefixasはどちらか一方、あるいはどちらも無しでも作動する。


実例

view/topicsディレクトリに、index, show, detailの3つのビューがある場合

image.png

通常のルーティング

それぞれのルートを作成する場合は以下のようになる。

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');
});
yuta-38
メモとして活用してます
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away