2012-11-06 10 views
13

ServiceManagerの場合、DIは何ですか?そのユースケースは何ですか?Zend DiとServiceManagerの依存関係注入コンテナ

彼らはzend-dizend-servicemanager両方の構成ファイルに私たちは、このようなaliasesinvokablesなど、いくつかのオプションを設定することができますので、似ているように見えます。

私はこれらのコンポーネントで何が起こっているのかをよりよく理解しようとしており、ドキュメントでは十分な情報が得られませんでした。

ServiceManagerの代わりにDiを使用する必要がありますか?

+0

http://www.php-fig.org/psr/psr-11/meta/ – Dennis

+0

上の一般的なコンテナの良い議論がありますあなたのフレームワークの一部でない限り、現代のアドバイスは "DIまたはSMを使わないでください"と思われます。 ZendはFactoryベースのService Manager(本質的に制限されたDIコンテナです)を使用しています。あなたが自分のクラスにコンテナを注入しないように注意しなければなりませんが、コンテナはあなたの設定の一部として使うことができます応用。すなわち、Zendでは、フレームワークの機能を使用して、依存関係がどのように配線されているかをカスタマイズできます。いくつかの最近の例がここにあります:https://docs.zendframework.com/tutorials/getting-started/database-and-models/ – Dennis

答えて

15

Zend \ DIは、サービスマネージャがユーザ提供のファクトリを使用している間に、依存性を検出して注入するために、リフレクションのように魔法に依存します。それは主な違いです。

複雑さ、デバッグ、パフォーマンスの問題のために、SMの方がコミュニティで推奨されなくなりました。 RADにとっては良いはずですが、正しく使用するには平均以上の知識が必要です。

一方、SMはかなり冗長で明示的な配線を持っていますので、後でコードを開き、何が起こっているのかを簡単に把握することができます。

+1

これは良い答えです。私は早い段階でDIを使うことを覚えています。私はそれを使用することに戻りません。 – DrBeza

+0

それは私がdiの使用を拒否するかもしれないことを意味し、smも仕事をしますか? – user1650441

+0

Xerkusが指摘した通りです。 Di-Stuffはかなり控えめだと考えられていますが、DIコンテナは単純に過度に複雑です。 ServiceManagerは同じコア問題をはるかにユーザーフレンドリーな方法で解決します。 – Sam

6

Zend\Diはクラスをまとめて処理しますが、Zend\ServiceManagerでは手動でワイヤリングし、インスタンス化するすべてのクラスのファクトリクロージャを作成する必要があります。

Zend\ServiceManagerは遅いReflection APIに依存しないため、はるかに高速です。一方、数百のクラスを持つ大規模なアプリケーションのクロージャを書くことは非常に面倒です。クロージャを最新の状態に保つことは、アプリケーションが成長するにつれて厄介になります。

この問題を解決するために、ZendDiCompilerというZend Framework 2モジュールを作成しました。 Zend\Diを使用してコードをスキャンし、ファクトリコードを自動生成してクラスをインスタンス化します。あなたは両方のコンポーネントのベストを得る:Zend\DiのパワーとZend\ServiceManagerのパフォーマンス。

ZendDiCompilerのドキュメントにかなりの作業を加えました。いくつかの簡単で高度な使用例も提供されています。

0

次のように基本的な違いは次のとおりです。

  • Zend\ZerviceManager =ファクトリー駆動のIoCコンテナ
  • Zend\Di =オートワイヤリングのIoC実装

Zend\Diは今より強固バージョン3.その行動のためのリファクタリングされ、 v2よりも予測可能で、Zend-Servicemanagerにシームレスに統合され、自動配線機能を提供します(これ以上の奇妙な魔法はありません)。依存関係を解決するためにPHPのリフレクションAPIを使用するので、工場主導のアプローチよりも遅いです。したがって、バージョン3にはAoTコンパイラが付属し、Reflectionの使用を省略した事前解決インジェクタを作成します。追加の利点:生成された工場はZend\ServiceManagerと直接使用することもできます。

両方のコンポーネントとIBMアカデミーを使用するためのガイドがあります:https://zendframework.github.io/zend-di/cookbook/aot-guide/

関連する問題