それは単なるフレームワークですか、それとも、このフレームワークは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' ); // $events = $serviceLocator->get('EventManager'); $events->attach($defaultListeners); $events->attach($serviceListener); $moduleEvent = new ModuleEvent; $moduleEvent->setParam('ServiceManager', $serviceLocator); $moduleManager = new ModuleManager($configuration['modules'], $events); $moduleManager->setEvent($moduleEvent); return $moduleManager; } }
プラグイン
コントローラーアーキテクチャには、独自のコードを追加できるプラグインシステムが含まれており、コントローラーの寿命中に特定のイベントが発生したときに呼び出されます。 フロントコントローラーは、プラグインブローカーをユーザープラグインのレジストリとして使用します;プラグインブローカーは、フロントコントローラーを介して登録された各プラグインでイベントメソッド呼び出しも提供します。
イベントメソッドは抽象クラス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、私はまだ理解していません)、およびサードパーティライブラリの接続について説明します。
オリジナルのブログドキュメント
イベントマネージャー
一次審査
- https://habr.com/post/131077/
- 新しい(公開時の)ツールの概要。
詳細分析
- http://zf2.com.ua/doc/50
- ZFに関するウクライナのコミュニティからのドキュメント。
サービスマネージャー
クイックスタート
- http://zf2.com.ua/doc/64、http://zf2.com.ua/doc/103
- ZFに関するウクライナのコミュニティからのドキュメント。
詳細分析
- https://habr.com/post/241471/
- 呼び出し可能、工場、その他のあいまいなもの。
モジュールマネージャー
ドキュメント
- http://zf2.com.ua/doc/98
- ZFに関するウクライナのコミュニティからのドキュメント。
私は短い遠足が長すぎず、有用であったことを願っています。 もちろん、Habrの規則および現在のロシア連邦の法律で許可されている編集、提案、批判、およびその他の行動は受け入れられます。
私たちが値するボーナス:
キティ
(= ^・Ω・^ =)