Java(特にSpring)では1つのコントローラーに複数の処理を書くのが一般的ですが、Laravelでは目的や使い方に応じて3種類のコントローラーが用意されているらしい。それぞれにちゃんと意味と使い分けの理由があるみたいなので、忘れないようにメモしておく!
Laravelの3種類のコントローラーとその違い
🧭 Laravelのコントローラーの種類まとめ
種類 | 特徴 | 使う場面 | Artisanコマンド |
---|---|---|---|
通常のコントローラー | 自由にメソッドを定義できる | 複数の処理をまとめたいとき | php artisan make:controller SampleController |
リソースコントローラー | CRUD操作用の7つのメソッドが自動で用意される | RESTfulなAPIや一覧・登録・編集など | php artisan make:controller SampleController --resource |
シングルアクションコントローラー |
__invoke() だけを持つ1アクション専用 |
単発の処理(例:お問い合わせ送信) | php artisan make:controller ContactController --invokable |
それぞれの使い方のイメージ
1通常のコントローラー(自由にメソッドを書く)
class UserController extends Controller {
public function index() { ... }
public function show($id) { ... }
public function update(Request $request, $id) { ... }
}
・いろんな処理を1つのクラスにまとめたいときに使う
・Javaのコントローラーに一番近いスタイル
2リソースコントローラー(CRUDに特化)
php artisan make:controller ProductController --resource
class ProductController extends Controller {
public function index() { } // 一覧
public function create() { } // 作成フォーム
public function store(Request $request) { } // 登録
public function show($id) { } // 詳細
public function edit($id) { } // 編集フォーム
public function update(Request $request, $id) { } // 更新
public function destroy($id) { } // 削除
}
・LaravelがREST APIのルールに沿ってルーティングを自動生成してくれる
・ルート定義も1行で済む:
Route::resource('products', ProductController::class);
3シングルアクションコントローラー(1つの処理だけ)
php artisan make:controller ContactController --invokable
class ContactController extends Controller {
public function __invoke() {
// お問い合わせ送信処理など
}
}
・Route::post('/contact', ContactController::class); のように使う
・1つの処理に特化したクラスなので、責務が明確でテストしやすい
使いたい場面 | おすすめのコントローラー |
---|---|
いろんな処理を1つにまとめたい | 通常のコントローラー |
CRUD処理を効率よく書きたい | リソースコントローラー |
単発の処理だけしたい | シングルアクションコントローラー |
まとめ
Laravelがコントローラーを3種類用意してるのは、「使いやすさ」と「責務の分離」を両立させるためなんだって。
Javaでは1つのクラスに複数のメソッドを書くのが普通だけど、Laravelは「処理の粒度に応じてクラスを分ける」という考え方が強いらしい…。
言語によって使い方が全然違うんだね。