20

クラス名の接尾辞Managerとについて少し混乱しています。Service

私が違いを理解している限り、Managers特定の種類のエンティティの処理 (作成、取得、削除など) を担当しています。たとえば、ModuleManagerは のロードとリターンを担当しModulesます。この場合、実際のエンティティであるModule.

ただし、Services特定のタイプのプロセス ロジックを実行するためのインターフェイスを提供するクラスです。たとえばLogService、特定のログ メッセージを定義済みのログ ライターに送信します。それがどこに行き、何をするかは気にしません。管理者に何が起こったのかを知らせたいだけです。

現在、ZF2 は、指定されたServiceManagerのインスタンスを作成して返す を提供していますService。コントローラーを小さく保ち、実際のロジックをテスト可能なクラスに保つために、コンテキストでusingにアクセスできるように、を作成Managersして提供することに誤って慣れてしまいました。を使用して取得することはお勧めできないため、これは現在私を混乱させている部分です。BUT : これを行っているのは私だけではありません:モジュールはこれの別の例です:デフォルトでを として登録します。factoryServiceManagerManager$this->getServiceLocator()->get('managerName');ControllerManagersServiceLocatorDoctrine ORMEntityManagerdoctrine.entitymanager.orm_default Service

と の真の違いを理解ServicesManagersていますか? 違いはありますか?コンセプトManagersも継承されているのではないでしょうか?Services

4

1 に答える 1

39

私はあなたのためにZF2のマネージャーとサービスを分解しようとします。

マネージャー

残念ながら、クラスを参照する「マネージャー」という単語は非常にあいまいであり、ZF2内では、この単語の使用方法に少し矛盾があります。したがって、ZF2の「マネージャー」が何であるかについての信頼できる定義は本当にありません。現在、ZF2の「マネージャー」は次のように分類するのが最適です。

  • ServiceManager —のインスタンスZend\ServiceManager\ServiceManager。複数のServiceManagerインスタンスが存在する可能性があります。デフォルトでは、「メイン」サービスマネージャーのみが存在し、「services」構成キーまたはモジュールのgetServiceConfig()メソッドによって返される配列によって構成されます。
  • プラグインマネージャー—これらはいくつかの特殊な機能Zend\ServiceManager\PluginManagerで拡張されます。Zend\ServiceManager\ServiceManagerこれらはフレームワーク内の多くのコンポーネントに分散されており、以前はプラグインローダー/ブローカーとして知られていた機能(以前のバージョンのZF2)を提供します。これらのプラグインマネージャーは、ビューヘルパーコントローラープラグインコントローラー自体などを初期化するものです。
  • その他の「マネージャー」Zend\ModuleManager\ModuleManagerやのようなものZend\Session\SessionManager。これらはServiceManagerとは何の関係もありませんが、名前のサフィックスとして「Manager」が付いているだけです。

特定の定義を念頭に置いて設計されていない用語(マネージャー)に定義を割り当てようとすると、混乱するかもしれません。の作者としてZend\ModuleManager、私はもともとコンポーネントを次のように開発したと言うことができますZend\Module(私は本当にマネージャーを接尾辞として好きではありません)。毎週開催されるIRCミーティングの1つで、Zend\Moduleあいまいであり、「マネージャー」という接尾辞を付けることで、そのあいまいさをなんとか解決できることが決定されました。明らかに、私はその問題に反対票を投じました。私のポイントは、Zend\ModuleManager定義上、「マネージャー」であるという仕様に合わせて開発されたものではないということです。

サービス

ZF2では、に関してZend\ServiceManager、「サービス」は単なるオブジェクトです(技術的には配列にすることもできます)。ServiceManagerコンポーネントは、アプリケーションが必要とする可能性のあるさまざまな「サービス」(オブジェクト)の単純なKey-Valueレジストリと考えることができます。これらの「サービス」は通常、構成済みのメーラー、ロガー、データベースアダプター、アプリケーション構成などです。もちろん、ServiceManagerは単なるレジストリではなく、その主な機能は、サービス(およびその依存関係)のインスタンス化を次のように延期することです。それらは実際に必要です。別名遅延読み込み); ServiceManagerのさまざまな機能を詳細に説明するブログ投稿を作成しました。

$ this-> getServiceLocator()-> get('managerName)を使用してManagerにアクセスできるように、誤ってManagerを作成してServiceManagerにファクトリを提供することに慣れました。

この場合、ここで「マネージャー」という用語と「サービス」という用語を混同している可能性があると思います。ServiceManagerに登録されているものは、単に「サービス」と呼ばれることがあります。実際、ある種の「マネージャー」をサービスとして登録できるため、これは混乱を招く可能性があります。たとえば、のインスタンスである「セッション」サービスを持つことができますZend\Session\SessionManager「サービス」という用語は一般にサービス層の一部を構成するクラスを指すため、さらに混乱が生じます。

したがって、残念ながら、はい、ZF2の用語は少し曖昧になる可能性がありますが、いくつかの比較的単純なコアコンセプトを理解すると、優れたデザインは、他のほとんどの製品とは比べものにならない驚くべき柔軟性を実際に開きます。そこにある既存のフレームワーク。

お役に立てれば。

于 2012-09-05T02:50:55.900 に答える