コントローラにさよならを言いましょう.今日からリクエストプロセッサ(Request Handlers)のパターンを使います.


ここ数年でPHP開発環境は大きく変化した.DRYやSOLIDのようなより良い設計モードの原則を使い始めた.しかし、なぜコントローラを使用しているのでしょうか.
以前、大規模なプロジェクトのアーキテクチャ作成に参加したことがある場合は、遅かれ早かれコントローラが多すぎることに気づいたかもしれません.コントローラロジックをさまざまなクラスライブラリまたはサービスクラスに分離しても、多くの依存項目とメソッド、およびコードの行数は時間とともに増加します.
リクエストプロセッサを紹介します.このコンセプトは簡単ですが、多くのPHP開発者が知らない.要求プロセッサは、単一の動作(Action)のみを含むコントローラとして理解され、応答への要求の流れをより明確にすることができる.この概念は、Paul M.Jonesが提案したAction-Domain-responder設計モードと類似しており、後者はMVCモードの代替品である.
リクエストプロセッサを確立するには、呼び出しクラスを使用するのが良い方法です.呼び出し可能クラスは、PHPのマジックメソッド__invokeを使用してCallableになり、関数として呼び出すことができます.呼び出しクラスの簡単な例を示します.
class Greeting
{
    public function __invoke($name)
    {
        echo 'Hello ' . $name;
    }
}

$welcome = new Greeting();
$welcome('John Doe'); //   Hello John Doe

ここを見ると君はたぶん思うだろう.「どうしてこんなことをするの?」これは少しでたらめな例だと知っています.しかし、呼び出し可能なオブジェクトや依存注入など、いくつかのコードと一緒に使用すると、意味があります.良い使用例は、LaravelおよびSlimフレームワークにおけるルーティングの要求処理である.
Route::get('/{name}', Greeting::class);

驚いたか?いいえ、ありません.通常書いているものと比較してみましょう
Route::get('/{name}', 'SomeController@greeting');

まだ?コードがきれいな以外に、他の利点があります.まず、コントローラよりもリクエストハンドラを使用するメリットを見てみましょう.
単一モード
SOLIDの第一原則は「単一モード」である.私から見れば、コントローラには多くの方法が存在し、この原則を破った.リクエスト・ハンドラは、これらの操作を独自のクラスに分割し、メンテナンス、再構築、テストを容易にする良いソリューションを提供します.
これは、UsersControllerから抽出された2つの要求ハンドラの例であり、ユーザプロファイルの編集および保存を処理する.
class EditUserHandler
{
    public function __construct(
        UserRepository $repository,
        Twig $twig
    ) {
        ...
    }

    public function __invoke(Request $request, Response $response)
    {
        ...
    }
}

class UpdateUserHandler
{
    public function __construct(
        UserRepository $repository,
        UpdateUserValidator $validator,
        ImageManager $resizer,
        Filesystem $storage
    ) {
        ...
    }

    public function __invoke(Request $request, Response $response)
    {
        ...
    }
}

次に、次のメリットを見てみましょう.
パフォーマンスのテスト
最近あなたのプロジェクトのためにユニットテストを書いたことがありますか?ユニットテストを作成するときに、テストに関係のないシミュレーション依存項目を作成することができます.リクエストプロセッサは、異なるコントローラ操作を個別のクラスに分割するため、アクションに必要な依存項目を注入またはバインドするだけです.
これはJeffrey WayのいくつかのアドバイスTwitterです.
ヒント:機能テストをできるだけ詳細にし、テスト例を使用して重要なルールと能力を説明します.
これは、リクエストプロセッサにテストファイルを持たせることはほとんどありません.煩雑なコントローラテストファイルにとって非常に良い改善です.
リファクタリング
PhpStormや他のエディタには強力なコード再構築機能がありますが、LaravelまたはSlimフレームワークのデフォルトのルーティング方法を使用してコントローラをルーティングにバインドしている場合は、このような問題に直面する可能性があります.
たとえば、名前の変更:
Route::get('/{name}', Greeting::class);

これよりずっと簡単です.
Route::get('/{name}', 'SomeController@greeting');

結論
リクエストプロセッサはコントローラの代替品です.コントローラの動作(Actions)は、単一の動作に応答する複数の独立した要求プロセッサクラスに分けられ、プロジェクト全体のコードのメンテナンス、再構築、テストを容易にする.
すべてのコントローラをリクエストプロセッサで置き換える必要がありますか?違うかもしれません.スモールアプリケーションでは、簡単にするために、アクショングループをコントローラに合成するのが合理的かもしれません.Teamleaderで仕事を始めてからリクエストプロセッサを発掘し始めましたが、最近コントローラを交換する必要はないと思います.
何か不明な点や疑問があれば、以下にコメントを残して教えてください.この文章を更新します.
PHP/Laravel開発者コミュニティからhttps://laravel-china.org/top...