第04回: ルーティング高度化(Resource/Nested) — URLは「設計」だ。土管事任になっていませんか?

章: 第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で複雑バリデーション で、コントローラから検証ロジックを分離する方法を学びます。

Related Articles