それは単なるフレームワークですか、それとも、このフレームワークはPHPコミュニティの誇りを体現していますか? 構成がばらばらになっている... PLの愛の対象であり、優れたMVCを持っているため、Zend Frameworkは最高のPHPフレームワークです。
ここでは、この質問に対する答えは見つかりませんが、ServiceManagerとModuleManagerについて学習します。

警告
- この資料は、私がZend Framework 2で探していたものに基づいており、一部の場所ではバージョン1の言及さえあります。 基本的な点が考慮され、グローバルに変更される可能性は低いため、他のバージョンと比較すると、これが問題になるとは思わない。
- 推論と翻訳(および段落1)には、私のソースと元のソースの両方に重大なエラーが存在する可能性があります。 すべてにリンクが与えられ、あなた自身の作業にはメモ[mine]が付きます。
- それはグーグルで、私のように混乱した人を対象としています。 ブログ、説明、双方向性の展開はありません。 しかし、2つの写真とキティがあります。
内容
規約
ソース 、少し[私の] 。
- アプリケーション -最終製品、サイト。
- モジュールは、アプリケーションの機能的に完成した「ブロック」であり、そのコードはモデル、表現、コントローラーで構成できます。 このモジュールはWebアプリケーションの機能を拡張し、「内部」でのみ機能できます。 モジュールは、
modulesセクションのapplication.config.phpに登録されapplication.config.php - ModuleManager-モジュールを操作するためのコンテナ。
- サービス -モジュール、モデル、コントローラー、タイプなどの間の操作のための「メカニズム」 サービスは、
service_managerセクションのmodule.config.phpに登録されmodule.config.php 。 - ServiceManager-サービスを操作するためのコンテナ。
- ControllerManager-コントローラーをロードするためのサービスとファクトリーで動作します(
\Zend\ServiceManager\AbstractFactoryInterfaceまたは\Zend\ServiceManager\ServiceManager )。 ドック - EventManager -1つまたは複数の名前付きイベント(イベント)のイベントハンドラー(リスナー)を集約し、これらのイベントの処理も開始するコンポーネント。
- プラグインは、何らかの方法ですべてのコントローラーの機能を拡張するクラスです。
デバイスフレームワーク
一般的な構造と関係
出所
Zend\Mvc\Applicationと、 Zend\ServiceManager\ServiceManagerオブジェクトが作成され、 Zend\Mvc\Service\ServiceManagerConfigを通じて設定されます。 ServiceManagerConfigは、 config/application.config.php (または作成時にApplicationに渡される他のアプリケーション構成)から構成を取得します。 Zend\Mvc\Service名前空間で表されるすべてのサービスとファクトリーのうち、 ServiceManagerConfigは、 EventManagerおよびModuleManager 3 SharedEventManager担当します。
その後、 ApplicationはModuleManager取得しModuleManager 。 この時点で、 ModuleManager 、 ServiceManagerを介して、 Zend\Mvc\Service\ServiceListenerFactory提供されるサービスとファクトリを構成します。 このアプローチにより、メインアプリケーションの構成を簡素化し、開発者がモジュールからMVCシステムのさまざまな部分を構成し、これらのMVCのサービスのデフォルト構成をオーバーライドできるようになります。
Zend\Mvc\Service\ModuleManagerFactory ModuleManagerで表されるZend\Mvc\Service\ModuleManagerFactory 。 これはおそらくMVCスタックで最も複雑なファクトリーです。 ModuleManagerは、キーmodule_listener_optionsおよびmodules使用してApplicationConfigサービスがデプロイ( Di )されることをmodule_listener_optionsしていmodules 。
抽出されたmodule_listener_optionsを使用して、 Zend\ModuleManager\Listener\DefaultListenerAggregateインスタンスを作成します。 次に、 ServiceListenerという名前のServiceListenerがあるかどうかを確認し、ない場合は、 Zend\Mvc\Service\ServiceListenerFactoryという名前のファクトリを使用します。 getServiceConfig 、 getControllerConfig 、 getControllerPluginConfig 、 getViewHelperConfigモジュールのリスナーなど、多くのリスナーサービスがServiceListenerに追加されます。
次に、 ModuleManagerはModuleManagerサービスを取得し、上記のリスナーをアタッチします。 「ServiceManager」パラメーターをサービスマネージャーオブジェクトに設定することにより、 Zend\ModuleManager\ModuleEventインスタンスを作成します。 最後に、 Zend\ModuleManager\ModuleManagerインスタンスを作成し、 Zend\ModuleManager\ModuleManagerとZend\ModuleManager\ModuleManagerを実装しModuleEvent 。
[mine]コードがより明確な場合:
<?php namespace Zend\Mvc\Service; use Zend\ModuleManager\Listener\DefaultListenerAggregate; use Zend\ModuleManager\Listener\ListenerOptions; use Zend\ModuleManager\ModuleEvent; use Zend\ModuleManager\ModuleManager; use Zend\ServiceManager\FactoryInterface; use Zend\ServiceManager\ServiceLocatorInterface; class ModuleManagerFactory implements FactoryInterface { public function createService(ServiceLocatorInterface $serviceLocator) { if (!$serviceLocator->has('ServiceListener')) { $serviceLocator->setFactory('ServiceListener', 'Zend\Mvc\Service\ServiceListenerFactory'); } $configuration = $serviceLocator->get('ApplicationConfig'); $listenerOptions = new ListenerOptions($configuration['module_listener_options']); $defaultListeners = new DefaultListenerAggregate($listenerOptions); $serviceListener = $serviceLocator->get('ServiceListener'); $serviceListener->addServiceManager( $serviceLocator, 'service_manager', 'Zend\ModuleManager\Feature\ServiceProviderInterface', 'getServiceConfig' );
プラグイン
出所
コントローラーアーキテクチャには、独自のコードを追加できるプラグインシステムが含まれており、コントローラーの寿命中に特定のイベントが発生したときに呼び出されます。 フロントコントローラーは、プラグインブローカーをユーザープラグインのレジストリとして使用します;プラグインブローカーは、フロントコントローラーを介して登録された各プラグインでイベントメソッド呼び出しも提供します。
イベントメソッドは抽象クラスZend_Controller_Plugin_Abstractで定義されZend_Controller_Plugin_Abstract 。このクラスからすべてのユーザープラグインが継承する必要があります
可視化
[私の]
- 矢印で特に指定されていない限り、上から下に読み取られます。
- 矢印付きの線は、含まれるものを示します。
- 矢印のない細い線は、接続されているものを示します。
- 矢印のない太線は、コントロールを示します。
コミュニケーションズ

スキーム

著者から
気配りのある読者は、記事はToasterへのリンクから始まり、ServiceManagerとModuleManagerの違いについて質問され、記事のテキストはそれらから始まることに注意しました。 偶然? そうは思いません 実際のところ、Habrはフレームワークの基礎を理解し始めた最初の場所であり、 出版物が混乱をもたらしました。そこでは、ブログが記事の著者によるコメント付きのドキュメントから再作成されました。 ModuleManagerの説明がなかったために、間違った理由(モジュールがServiceManagerに登録されている)に追い込まれ、この記事が執筆されました。
便利なリンク
コピーペーストを行い、1つのトピックで6つの部分を成長させたくないので、ZFのブックマークのリストをメモで囲みます。
注意ネタバレ!ブログ
Habrからの3つの記事で
- https://habr.com/post/192522/
- ZendSkeletonApplicationで簡単なブログを作成するためのドキュメントの無料翻訳。 構成、ServiceManager(またはModuleManager、私はまだ理解していません)、およびサードパーティライブラリの接続について説明します。
オリジナルのブログドキュメント
イベントマネージャー
一次審査
詳細分析
サービスマネージャー
クイックスタート
詳細分析
モジュールマネージャー
ドキュメント
私は短い遠足が長すぎず、有用であったことを願っています。 もちろん、Habrの規則および現在のロシア連邦の法律で許可されている編集、提案、批判、およびその他の行動は受け入れられます。
私たちが値するボーナス:
キティ
(= ^・Ω・^ =)