0

わかりましたので、ロガー、http リクエスト、http レスポンス、ルーターなどの単一インスタンス オブジェクトを作成および管理する、このサービス マネージャー/ロケーター/ファクトリ オブジェクトがあります。

startup/bootstrap ファイルでは、インスタンス化してサービスを開始します。

$services = new Services();

$logger = $services->getService('logger');
$security = $services->getService('security');
$auth = $services->getService('auth');
$router = $services->getService('router');
etc...

各サービスの依存関係を認識し、ファクトリのようにオブジェクトを簡単に作成します。

Authたとえば、私のクラスです。数か月で何らかの形でさらに2つの依存関係が必要な場合は、次のようにする必要があります。

  1. Servicesクラスをインスタンス化するクラスのメソッドを変更しますAuth
  2. クラスのコンストラクターを変更Authし、2 つの新しい依存関係を追加します。

5分もかかりません。

この$servicesオブジェクトは、コントローラーのインスタンスも作成します。すべてのコントローラーには、(現時点で) 1 つの依存関係 ( View.

これに関する問題は、明らかに同じ依存関係を持つさらに 20 個のコントローラーを作成すると、数か月後にコントローラーにさらに 2 つの依存関係を追加する必要があることです。

  1. Servicesクラスをインスタンス化するクラスのメソッドを変更しますController
  2. すべてのコントローラー クラスのコンストラクターを変更し、2 つの新しい依存関係を追加します。

サービスマネージャー/ロケーター/ファクトリーオブジェクトの外部でコントローラーを個別に作成し、代わりに$servicesオブジェクトをコントローラーに注入すると、私が作成するすべてのコントローラーが1つの依存関係しか持たないことがわかります。私はそれらを何百万も作ることができ、別の依存関係が発生した場合、すべてのコントローラーファイルを変更する必要はありませんが、これは問題ありませんか?

サービスマネージャーから1つまたは2つのサービスしか必要としない場合、コントローラーに多くを注入するように感じます。また、コントローラーの依存関係を隠します。コンストラクターに注入する場合ほど目に見えません。 .

これについてどう思いますか。そして、私は何をすべきだと思いますか?

ありがとう。

4

1 に答える 1

0

サービスクラス内で使用するコントローラーファクトリ(またはメソッド)が必要なようです。
引数として、クラス名を渡すことができます。例:

$controller = $this->controllerFactory->create('Foo\BarController');
$controller->setAnotherDependency($baz);

すべてのコントローラーで共有されるわけではない追加の依存関係は、セッターを介して追加できます。

ところで: PimpleSymfony2 DICのような依存関係コンテナを使用してみませんか?

于 2013-01-01T23:02:37.743 に答える