AUTOVICE

TECH BLOG

【Laravel 6.x】ネスト構造になっているRESTfulルーティングの定義方法

2020-03-04

はじめに

RESTfulルーティングを定義するときはRoute::resourceを使いますが、ネスト構造になっているRESTfulルーティングの定義方法を調べたので記事にします。

前提

おそらく、Laravel 6.xのみ対応だと思います。

※Laravel公式ドキュメントの5.8以前には記載がないため。間違っていたらご指摘ください。

定義方法

一般的なブログを想定します。ブログでは複数の記事を持ち、それぞれの記事に複数のコメントを持ちます。

routes/web.phpを以下のように設定します。

Route::resource('articles', 'ArticlesController');
Route::resource('articles.comments', 'CommentsController');

第1階層と第2階層のリソース名をピリオドで繋げます。

Route::resource('articles', 'ArticlesController');
Route::resource('articles/comments', 'CommentsController');

ピリオドではなくスラッシュで繋げると、ネストではないURIになるのでご注意ください。

ルーティングを確認してみます。

$ php artisan route:list
+--------+-----------+--------------------------------------------+---------------------------+-------------------------------------------------+--------------+
| Domain | Method    | URI                                        | Name                      | Action                                          | Middleware   |
+--------+-----------+--------------------------------------------+---------------------------+-------------------------------------------------+--------------+
|        | GET|HEAD  | articles                                   | articles.index            | App\Http\Controllers\ArticlesController@index   | web          |
|        | POST      | articles                                   | articles.store            | App\Http\Controllers\ArticlesController@store   | web          |
|        | GET|HEAD  | articles/create                            | articles.create           | App\Http\Controllers\ArticlesController@create  | web          |
|        | GET|HEAD  | articles/{article}                         | articles.show             | App\Http\Controllers\ArticlesController@show    | web          |
|        | PUT|PATCH | articles/{article}                         | articles.update           | App\Http\Controllers\ArticlesController@update  | web          |
|        | DELETE    | articles/{article}                         | articles.destroy          | App\Http\Controllers\ArticlesController@destroy | web          |
|        | GET|HEAD  | articles/{article}/comments                | articles.comments.index   | App\Http\Controllers\CommentsController@index   | web          |
|        | POST      | articles/{article}/comments                | articles.comments.store   | App\Http\Controllers\CommentsController@store   | web          |
|        | GET|HEAD  | articles/{article}/comments/create         | articles.comments.create  | App\Http\Controllers\CommentsController@create  | web          |
|        | GET|HEAD  | articles/{article}/comments/{comment}      | articles.comments.show    | App\Http\Controllers\CommentsController@show    | web          |
|        | PUT|PATCH | articles/{article}/comments/{comment}      | articles.comments.update  | App\Http\Controllers\CommentsController@update  | web          |
|        | DELETE    | articles/{article}/comments/{comment}      | articles.comments.destroy | App\Http\Controllers\CommentsController@destroy | web          |
|        | GET|HEAD  | articles/{article}/comments/{comment}/edit | articles.comments.edit    | App\Http\Controllers\CommentsController@edit    | web          |
|        | GET|HEAD  | articles/{article}/edit                    | articles.edit             | App\Http\Controllers\ArticlesController@edit    | web          |
+--------+-----------+--------------------------------------------+---------------------------+-------------------------------------------------+--------------+

たった2行の定義でネスト構造になっているRESTfulルーティングが定義できました。

まとめ

意外と言及している記事がなくてちょっと苦労しました。しかし公式ドキュメントにはしっかり書いてありましたので、ちゃんと公式ドキュメントを確認する癖をつけないとだめですね😅

Controllers - Laravel - The PHP Framework For Web Artisans