2013-09-08 6 views
15

私はzf2を学び、ウェブからドキュメント、チュートリアルなどを読んでいます。今私はZend\ServiceManager\ServiceManagerAwareInterface.phpZend\ServiceManager\ServiceLocatorAwareInterface.phpについて混乱しています。zf2 ServiceManager vs ServiceLocator

はまた、(コントローラのような)いくつかの場所で私はいくつかの他の場所で私たちが->getServiceManager()を使用しながら、ServiceManagerオブジェクトを取得するために$this->getServiceLocator()を使用して、それも同じServiceManagerオブジェクトを返します。

+0

@Sam、:

はかなりの時間前、私はまた、Locatorおよびマネージャについてブログ? – haim770

+0

しかし、なぜ2つのインターフェイスがありますか。 'Zend \ ServiceManager \ ServiceManagerAwareInterface.php'と' Zend \ ServiceManager \ ServiceLocatorAwareInterface.php'を参照してください。 SMがSLの実装である場合、なぜ私たちは別のインタフェースを持っていますか? –

答えて

16

ロケータはインターフェイスです。 Zend Framework 2の設計は、「契約による設計」によって行われます。つまり、クラスではなくインターフェイスを使用します。 ManagerはLocatorのデフォルト実装です。

ロケータを使用するコンポーネントは1つではありません。しかし、マネージャーは、インターフェースよりも多くの機能を提供しています。 Zend\Mvc\Applicationはこれらの機能を使用するため、ロケータの代わりにマネージャに依存しています。

* Awareイニシャライザでロケータを使用する決定が遅すぎたため、ServiceLocatorAwareInterfaceServiceManagerAwareInterfaceの両方が存在するのはこのためです。 Managerのイニシャライザを使用するユーザランドコードは既に存在していたので、下位互換性のために保存されています。内部的には、すべてのコンポーネントがロケータ初期化子を使用します。選択する必要がある場合は、ロケータを選択し、可能な限りManagerを離れたままにしておきます。私たちはその後、両方の方法を必要としないのはなぜhttps://juriansluiman.nl/article/120/using-zend-framework-service-managers-in-your-application

5

ServiceManagerは基本的にServiceLocatorインターフェイスの実装です。この2つがある理由は、ユーザがServiceLocatorインターフェイスの独自の実装を持つことができるためです。 ->getServiceManager()をリクエストすると、明示的にServiceManagerの実装が返されます。 ->getServiceLocator()を使用すると、ServiceLocatorインターフェイスの実装を要求しています。このインターフェイスは、ServiceManagerまたは独自のインターフェイスで実装できます。しかし、ほとんどの場合、デフォルトのServiceManagerの実装しかないので、同じオブジェクトを取得します。

+0

それはある意味がありますが、なぜ我々は 'Zend \ ServiceManager \ ServiceManagerAwareInterface.php'を持っているのでしょうか?どのアプローチを使用すべきだと思いますか? –

+2

私は 'ServiceLocator'を利用しています。これは、利用可能な特性を持っているので、私はその特性を使い、自分自身でSL/SMを何度も実装する必要はありません。 – Bryan