PHP でControllerクラスを作成する際の問題を解決する方法は次のとおりです。
- 依存性注入を採用することで簡単にテストできます。
- 最終プログラマーに共有オブジェクトを提供する
- 新しいユーザー ライブラリをロードする方法を提供する
依存性注入フレームワークを使用したコントローラーのインスタンス化については、下を見てください
問題は、派生コントローラーが、プログラマーが必要とするあらゆるリソース (フレームワークが提供するものなど) を使用できることです。共有リソース (DB、ユーザー、ストレージ、キャッシュ、ヘルパー)、ユーザー定義のクラス、または別のライブラリへの統合アクセスを作成する方法は?
エレガントなソリューション?
私の問題にはいくつかの解決策がありますが、どちらもエレガントではないようです
- コンストラクターによってすべての共有オブジェクトを渡そうとしますか? (10 個のプレースホルダーがあってもコンストラクターを作成する場合があります)
- ゲッター、セッターを作成しますか? (肥大化したコード)
$controller->setApplication($app)
- 共有リソースにシングルトンを適用しますか?
User::getInstance()
またDatabase::getInstance()
- コントローラー内でオブジェクトを共有するためのシングルトンとして依存性注入コンテナーを使用しますか?
- ファクトリとして1 つのグローバル アプリケーション シングルトンを提供しますか? (これはphpフレームワークで非常に使用されているように見えますが、DIの原則とデメテルの法則に強く反しています)
強く結合されたクラスを作成することは推奨されておらず、追放されていることは理解しています:)、しかし、このパラダイムが他のプログラマー(コントローラークラス)の出発点にどのように適用されるかはわかりません。提供された共有リソースにアクセスできる必要がありますMVC アーキテクチャに。コントローラー クラスを小さなクラスに分割すると、MVC の実際的な意味が何らかの形で破壊されると思います。
依存性注入フレームワーク
DI フレームワークは実行可能な選択肢のようです。ただし、問題は引き続き発生します。Controller のようなクラスは Application 層ではなく、RequestHandler/Response 層に存在します。
このレイヤーはコントローラーをどのようにインスタンス化する必要がありますか?
- このレイヤーにDIインジェクターを渡しますか?
- シングルトンとしてのDIフレームワーク?
- このレイヤーのみに分離された DI フレームワーク構成を配置し、別の DI インジェクター インスタンスを作成しますか?