1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Javaはコントローラクラス一つだったのにPHPに書き換えたら複数になった・・・】

Posted at

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は「処理の粒度に応じてクラスを分ける」という考え方が強いらしい…。
言語によって使い方が全然違うんだね。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?