【Laravel】単一アクションのコントローラを作る

こんにちは。今回は単一アクションのコントローラを作成する方法を解説します。

単一アクションのコントローラとは

コントローラには通常、複数のアクションを定義するかと思います。ここでいうアクションとはルータから呼ばれる公開メソッドを指します。単一アクションのコントローラとは、このアクションを1つのみ持つコントローラという意味です。

単一アクションのコントローラはいつ必要になるのでしょうか。以下の2パターンがあると私は考えています。

  • 特定アクションが複雑であり、単一でファイルを作成しないとコントローラが肥大化する。
  • コントローラは単一アクションで作成する規約にしている(粒度を揃えるため)

どちらもコントローラの肥大化を避け、コードの見通しを良くすることが目的です。実際に私も単一アクションのコントローラでアプリケーションを作ることが多いです。それでは単一コントローラの作り方を見ていきましょう。

単一アクションコントローラの作り方

まずはコントローラのクラスを作成しましょう。1クラスに対し、1アクションを定義するので、クラスはアクションを表す名前で作成します。今回はUserモデルをすべて取得するGetUsersコントローラを作成します。以下のartisanコマンドを実行します。

php artisan make:controller GetUsers --invokable

–invokableオプションを付与することがポイントです。こうすることで単一アクションのコントローラが作成されます。作成されたコントローラのコードは以下です。

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\User;

class GetUsers extends Controller
{
    /**
     * Handle the incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function __invoke(Request $request)
    {

    }
}

__invokeという名前のpublicメソッドが1つ作成されています。このメソッドの中にアクションを記述していきます。

次にコントローラをルータから呼び出すコードを記述します。

use App\Http\Controllers\GetUsers;

Route::get('/users', GetUsers::class);

ポイントはコントローラを呼び出すときにアクション名を記述していないことです。単一アクションなので、アクションを指定しなくても自動でGetUsersコントローラの__invokeメソッドが呼び出されるわけです。

以上で単一アクションのコントローラ作成は完了です。

まとめ

単一アクションのコントローラの作成方法を解説しました。私は個人的に気に入って使っています。単一アクションにすることで、ファイル名を見るだけでやりたいことがなんとなくわかるようになるので、コードが自然と整理されていくんですよね。あと、1コントローラのコード量が減るのでコードを探す負荷を軽減してくれます。気になった方は使ってみてください。メリットが多いと思います。

Laravel

Posted by kobainmac