はじめに
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ルーティングが定義できました。
まとめ
意外と言及している記事がなくてちょっと苦労しました。しかし公式ドキュメントにはしっかり書いてありましたので、ちゃんと公式ドキュメントを確認する癖をつけないとだめですね😅