コントローラーの作成と構造

1. コントローラーとは

Laravel における コントローラー (Controller) は、ルートとビジネスロジックの橋渡しを担うクラスです。

  • ルートで受け取った HTTP リクエストを解析し、必要に応じてモデルを呼び出し、レスポンスを返します。

  • MVC アーキテクチャにおける「C」に位置し、処理の集約・再利用を容易にします。


2. コントローラーの作成

手段 コマンド例 生成されるファイル 用途
通常コントローラー php artisan make:controller ArticleController app/Http/Controllers/ArticleController.php 任意のメソッドを自由に定義
リソースコントローラー php artisan make:controller ArticleController --resource 同上 RESTful7アクション(index, create, store, show, edit, update, destroy)を雛形生成
APIリソース php artisan make:controller Api/ArticleController --api app/Http/Controllers/Api/ArticleController.php 上記から create/edit ビュー関連を除外
シングルアクション php artisan make:controller ShowArticle --invokable app/Http/Controllers/ShowArticle.php __invoke() のみを持つ単機能

補足

  • 生成場所は app/Http/Controllers が既定。サブディレクトリ指定でネームスペースも自動反映されます。

  • --model=Article を併用すると、型指定されたモデルが各メソッドにインポートされます (Laravel 10 以降)。


3. コントローラーの基本構造

php
<?php namespace App\Http\Controllers; use App\Models\Article; use Illuminate\Http\Request; class ArticleController extends Controller { /** * 一覧表示 */ public function index() { $articles = Article::latest()->paginate(10); return view('articles.index', compact('articles')); } /** * 新規作成フォーム */ public function create() { return view('articles.create'); } /** * 保存処理 */ public function store(Request $request) { $validated = $request->validate([ 'title' => ['required', 'max:255'], 'body' => ['required'], ]); Article::create($validated); return redirect()->route('articles.index') ->with('status', '作成しました'); } // … show, edit, update, destroy メソッドが続く … }

主なポイント

  1. ネームスペース
    namespace App\Http\Controllers; が PSR-4 に基づき解決され、ルート側の use は不要です。

  2. 継承
    Controller 基底クラスを継承し、共通ミドルウェアや共通ヘルパを利用可能。

  3. 依存性注入

    • Request オブジェクトやモデルをメソッド引数に型宣言するだけで自動注入されます。

    • コンストラクタでサービスクラス等を注入し、クリーンアーキテクチャを実現可能。

  4. バリデーション

    • $request->validate() は失敗時に自動リダイレクト+エラーメッセージ。

    • フォームリクエストクラスに委譲すると、コントローラーがさらに薄く保てます。

  5. レスポンス種別

    • view(), redirect(), response()->json() など、要求に応じたファサードを返却。


4. ルートとの紐付け

php
use App\Http\Controllers\ArticleController; Route::resource('articles', ArticleController::class); // もしくは個別に Route::get('/articles', [ArticleController::class, 'index'])->name('articles.index'); Route::post('/articles', [ArticleController::class, 'store'])->name('articles.store');
  • Route::resource は RESTful パターンとコントローラーのメソッド名を自動対応させます。

  • ルートグループやミドルウェア (middleware('auth')) もまとめて適用可能。


5. シングルアクションコントローラー

php
class ShowArticle extends Controller { public function __invoke(Article $article) { return view('articles.show', compact('article')); } }
php
Route::get('/articles/{article}', ShowArticle::class);
  • __invoke() のみでルートにバインド。小規模機能や API エンドポイントに便利です。


6. コントローラーを「薄く」保つ設計指針

課題 解決策
ビジネスロジックが肥大化 サービスクラスアクションクラスへ委譲
バリデーションが複雑化 フォームリクエスト (php artisan make:request) へ分離
共通前処理が散在 ミドルウェア または trait を活用
メソッドが増大 モジュール単位でコントローラー分割、RESTful 準拠を維持

「薄いコントローラー、太いモデル」よりも、近年はサービスレイヤクエリビルダ/リポジトリで責務分離し、テスト容易性を高める設計が推奨されています。


7. テストと保守

  • Feature テスト: php artisan make:test ArticleControllerTest で HTTP レスポンスを検証。

  • 統合テスト: DB のダミーデータ投入 (Factory/Seeder) と組み合わせ、実運用に近い振る舞いを確認。

  • PHPStan, Psalm: 静的解析で型安全性を高め、リファクタリング時の破壊を防止。


まとめ

Laravel のコントローラーは、ルートの集中管理・コード再利用・テスト容易性を実現する要の層です。artisan make:controller 系コマンドを活用しつつ、

  • RESTful リソース生成

  • シングルアクションの活用

  • サービス層やフォームリクエストによる責務分離

を組み合わせることで、可読性と保守性に優れたアプリケーション構造を築けます。

ChatGPT4o 生成日:2025/06/23