ルートとコントローラーの連携

ルートとコントローラーの役割

Laravel では ルート (routes) が「URL → 処理の入り口」を定義し、コントローラー (controllers) が「その URL に対応するビジネスロジック」をまとめて担当します。両者を正しく連携させることで、URL 設計とアプリケーションロジックを疎結合に保ちながら可読性と保守性を高められます。laravel.comlaravel.com


1. ルートファイルとコントローラーのひも付け

用途 代表的なルートファイル ひも付け例
Web 画面 routes/web.php Route::get('/users', [UserController::class, 'index']);
API routes/api.php Route::post('/login', [AuthController::class, 'store']);
  • 配列シンタックス [ControllerClass::class, 'method'] を使うことで、クラス名の変更や IDE リファクタリングに強くなります。

  • Laravel 11 以降は Route::get() などのメソッドでも 完全修飾クラス名 (FQCN) を推奨。use App\Http\Controllers\UserController; を先頭に書くと簡潔になります。amanj0314.medium.com


2. シングルアクション(Invokable)コントローラー

1 メソッドだけを持つクラスを __invoke() で定義し、ルート側ではメソッド名を省略できます。

php
// app/Http/Controllers/ShowProfile.php class ShowProfile { public function __invoke(User $user) { return view('profile', compact('user')); } } // routes/web.php Route::get('/users/{user}', ShowProfile::class);
  • コマンド php artisan make:controller ShowProfile --invokable で生成可能。laravel.com


3. Route::controller グループ

同じコントローラー内の複数メソッドをまとめて束ねられます。

php
Route::controller(PhotoController::class)->group(function () { Route::get('/photos', 'index')->name('photos.index'); Route::post('/photos', 'store')->middleware('auth'); Route::get('/photos/{photo}', 'show'); });
  • プレフィックス・ミドルウェア・名前付きルートを一括で指定でき、ファイルの重複を削減できます。


4. リソースコントローラー

RESTful CRUD をワンライナーで登録できます。

php
Route::resource('articles', ArticleController::class);

生成される 7 アクション(index, create, store, show, edit, update, destroy)と URL は Laravel のコア仕様と一致するため学習コストが低く、API バージョニングにも強い設計になります。必要に応じて except(['destroy'])only(['index','show']) で調整可能です。laravel.com


5. ルートモデルバインディング

ルートパラメータを直接 Eloquent モデルに解決し、コントローラーに DI できます。

php
Route::get('/users/{user}', [UserController::class, 'show']);
php
public function show(User $user) // 文字列ではなく User モデル { // 404 処理も自動 return view('users.show', compact('user')); }
  • 暗黙バインディング(ID カラム以外を使う場合は Route::model() で明示的バインディング)。

  • コントローラー側で余計な User::findOrFail() を書く必要がなくなります。laravel.com


6. ネームスペース、ミドルウェア、prefix の活用

php
Route::middleware(['auth'])->prefix('admin')->name('admin.')->group(function () { Route::resource('users', Admin\UserController::class); });
  • ミドルウェア … コントローラーへ到達する前に共通のフィルタ処理。

  • 名前付きルート … ビューやリダイレクト内で route('admin.users.index') のように呼び出し、URL 変更に強くする。

  • prefix … URL の物理的な共通接頭辞。MVC の責務分離を崩さずにルート整理が可能です。


7. 依存性注入 (DI) とシグネチャ

php
class OrderController extends Controller { public function __construct(private OrderService $service) {} public function store(StoreOrderRequest $request) { $this->service->create($request->validated()); return redirect()->route('orders.index'); } }
  • コントローラー・アクション双方にコンストラクタ/メソッドインジェクションが可能。テストも書きやすくなります。

  • Laravel 11 では readonly プロパティプロモーション を積極採用、Laravel 12 では 型安全な DI と最適化されたルートキャッシュ が強化されています。medium.com


8. ルートキャッシュとパフォーマンス

bash
php artisan route:cache # 本番ビルド php artisan route:clear # 変更時
  • ルート定義を一括でシリアライズし、フレームワーク起動時の解析コストを削減します。

  • Laravel 12 では 最適化ルーティング が導入され、キャッシュ時のオーバーヘッドがさらに縮小されています。laravel.commedium.com


9. テストへの影響

  • Route::get() 等をクロージャでなくコントローラーにまとめることで、HTTP テスト ($this->get('/users')) と ユニットテスト (UserControllerTest) を明確に分離できます。

  • withoutMiddleware()actingAs() を使い、ルーティング層~コントローラー層の挙動を柔軟に検証可能です。


まとめ

  1. URL 設計はルートファイル、ロジックはコントローラー で責務を分離する。

  2. 配列シンタックス + FQCN で IDE 補完・リファクタリングに強くする。

  3. Route グループ・リソース・モデルバインディングを活用して 重複定義を削減

  4. Laravel 11/12 では 型安全・パフォーマンス最適化 が進み、ルートとコントローラーの連携がより高速・堅牢になっています。

これらを押さえると、規模が大きくなっても見通しの良いルーティングとコントローラー構成を維持できます。

ChatGPT4o 生成日:2025/06/23