章: 第2章: Web層の実践設計
Route::get('/posts/{id}/comments/{cid}', ...) のようなルートがファイル中に散らばっていないでしょうか?ルート定義とControllerが糸引っ張り合いの状態になると、新しいエンドポイントを追加するたびに全体を見回す必要が出てきます。
Route::resource と ->shallow() を使えば、RESTに準拠した7アクションを自動生成しつつ、Controllerの責務を明確にできます。URL設計は「感覚」ではなく「ルール」で行いましょう。
なぜResourceルートが重要なのか
ルートを手書きすると次の問題が起きます。
- HTTPメソッドとURLの対応が担当者によって差が出る
- 同じリソースが複数ファイルに重複定義される
php artisan route:listが閲覧できない長さになる
チェックポイント: Nestedルートは2階層までを目安に。それ以上は設計を見直すサインです。
最小限のルート vs Resourceルート
| 観点 | 手書き | Route::resource |
| エンドポイント数 | 定義に比例 | 7アクションを自動生成 |
| 責務の明確さ | 担当者次第 | Controller名から明確 |
| テストの書きやすさ | URLが変わると壊れる | named routeで安定 |
| 拡張性 | 各ファイルを修正 | ->only() ->except() で制御 |
実装例
<?php
use App\Http\Controllers\PostController;
use App\Http\Controllers\CommentController;
Route::resource('posts', PostController::class);
Route::resource('posts.comments', CommentController::class)
->shallow();
// 例: GET /posts/1/comments
// shallow後: GET /comments/{comment}
shallow()の効果
->shallow() を付けると、親リソースのIDが特定に必要なアクションには親プレフィックスを残し、決まったIDだけで特定できるアクションからは親プレフィックスを削除します。URLが短くなり、テストも書いていやすくなります。
まとめ & 次のステップ
Route::resourceでRESTの7アクションを自動生成し、手書きルートの重複を排除する- Nestedルートで親子関係をURL空間に表現できるが、深さは2階層まで
->shallow()でURLを簡潔に保ちつつ、親院欲みで特定できるアクションのみ親プレフィックスを残す- named route(
route('posts.comments.index'))を使うことでURL変更に強くなる
次回は 第05回: Form Requestで複雑バリデーション で、コントローラから検証ロジックを分離する方法を学びます。