0

だから私は次のジレンマを持っています。すべての ZF2 アプリケーションが使用する共通のライブラリが必要です。このライブラリには、私の Web サイトのすべてのビジネス ロジックが含まれます。各アプリケーションは、ライブラリのさまざまな部分を使用して、必要なアクションを適切に表示/実行します。これで、ライブラリを作成することができました。それをフーと呼びましょう。Foo には、ライブラリ全体をロードするために必要な基本的な自動ロードを行う Module.php があります。

ここで問題が発生し始めます。ZF2 の依存性注入、サービス マネージャーなどを Foo 内で利用したい。問題は、Foo をロードする Module.php が 1 つしかないことです。これは、ライブラリが成長するにつれて Module.php も成長することを意味します。これは、私が知る限り、サブモジュールを持つことができないためです。この問題を回避する方法はありますか?

基本的に、すべてのアプリに Foo と Foo を含めていくつかの Module.php を持たせ、少なくとも依存関係をモジュールごとに処理できるようにしたいと考えています。

4

1 に答える 1

0

サブモジュールを試して実行するために、おそらく流れに逆らっていますが、おそらくその必要はありません。

モジュールを適切に作成した場合、それをロードすることはそれほど高価な操作ではありません。サービスマネージャーの要点は、これらすべてのサービスが遅延して作成されることです。したがって、呼び出し元のコードが特定のリクエストで特定のサービスを要求しない場合、そのサービスのクラスファイルが自動ロードされたり、オブジェクトがインスタンス化されたりすることはありません.

EventManager に大きく依存していて、モジュールが多数のリスナーをアタッチしている場合は、少し扱いが難しくなる可能性があります。ただし、いくつかのモジュール構成ディレクティブを設定し、条件付きでリスナーをアタッチすることで、おそらくこれを回避できます。

そうは言っても、モジュールを分割しようとするのはおそらく理にかなっています。したがって、FooBar および FooBaz モジュールを使用できます。

本当に、本当に、サブモジュールが必要な場合は、ModuleManager を掘り下げて、それを理解しようとすることができます。私は一度その道を少し下ったことがあります - そして気が散ってしまいました。私の場合、物理的なアイテムの発送を扱っていました。私のメインのフルフィルメントモジュールがロードされたすべてのサブモジュールを特定せずに反復できるように、一連の同様の出荷モジュール(Fulfillment\Courier\USPSModule、Fulfillment\Courier\FedExModuleなど)をロードするように構成できる「フルフィルメント」モジュールが必要でしたそれらのいずれかに関する知識。私の記憶が正しければ、それを行う最善の方法は、基本的に ZF2 が行うことをミラーリングすることでしたが、Fulfillment\Module クラス内で行いました。ただし、同じインターフェースをすべて実装する類似のサブモジュールのセットが必要でない限り、それを実行したい状況はあまり思いつきません。それらを特定の知識を持たないスーパーモジュールによって消費されることを望みます。エンドユーザーによるこれらのサブモジュールの実行時有効化/無効化(プラグインシステムのようなもの)について考えていたので、私もこれを見ました。

そうでない場合は、理にかなっている限り、FooBarModule、FooBazModule などに固執することをお勧めします。また、モジュールに大量のコードが含まれている場合でも、ServiceManager は、特定の要求の依存関係を満たすために必要なクラスのみをオートロード、解析、およびインスタンス化することを忘れないでください。

于 2013-02-11T23:51:17.987 に答える