它只是一个框架,还是该框架体现了PHP社区的骄傲-可以说,它是一个努力工作的开发人员的重要组成部分? 随着分散的配置... PL的热爱对象,它具有良好的MVC,因此Zend框架是最好的PHP框架。
在这里,您将找不到该问题的答案,但将了解ServiceManager和ModuleManager。

警告
- 该材料基于我在Zend Framework 2中寻找的内容,在某些地方甚至提到了版本1。 与其他版本相比,我认为这不会成为问题,因为考虑了基本点并且它们不太可能在全球范围内更改。
- 在推理和翻译(以及第1款)中,可能有重大错误,包括我的来源和原始来源。 将为所有链接提供链接,并且您自己的工作将带有注释[mine] 。
- 它针对的是那些像我一样对Google感到困惑的人。 不会部署博客,说明和互动。 但是会有两张照片和一只小猫。
目录内容
条款
来源 ,一点点[我的] 。
- 应用 -最终产品,现场;
- 模块是功能上完整的应用程序“块”,其代码可以包括模型,表示形式和控制器。 该模块扩展了Web应用程序的功能,并且只能在内部“运行”; 模块在
modules
部分的application.config.php
中注册 - ModuleManager-用于操作模块的容器;
- 服务 -模块中的“机制”,用于模型,控制器,类型等之间的操纵。 服务在
service_manager
部分的module.config.php
中注册。 - ServiceManager-用于处理服务的容器。
- ControllerManager-与服务和工厂配合使用以加载控制器(
\Zend\ServiceManager\AbstractFactoryInterface
或\Zend\ServiceManager\ServiceManager
)。 码头 - EventManager-聚集一个或多个命名事件(事件)的事件处理程序(侦听器),并启动这些事件的处理的组件。
- 插件是一类以某种方式扩展所有控制器功能的类。
设备框架
总体结构和关系
来源
Zend\Mvc\Application
,将通过Zend\Mvc\Service\ServiceManagerConfig
创建和配置Zend\ServiceManager\ServiceManager
对象。 ServiceManagerConfig
从config/application.config.php
(或在创建Application
时传递给Application
其他一些应用程序配置)获取配置。 在Zend\Mvc\Service
命名空间中表示的所有服务和工厂中, ServiceManagerConfig
仅负责三个: SharedEventManager
, EventManager
和ModuleManager
。
之后, Application
检索ModuleManager
。 此时, ModuleManager
通过ServiceManager
配置Zend\Mvc\Service\ServiceListenerFactory
提供的服务和工厂。 这种方法使我们能够简化主应用程序的配置,并为开发人员提供了从模块配置MVC系统各个部分的机会,从而覆盖了这些MVC服务中的任何默认配置。
ModuleManager
,以Zend\Mvc\Service\ModuleManagerFactory
。 这也许是MVC堆栈中最复杂的工厂。 ModuleManager
希望通过键module_listener_options
和modules
部署ApplicationConfig
服务。
它使用提取的module_listener_options
创建Zend\ModuleManager\Listener\DefaultListenerAggregate
的实例。 然后,它检查是否有一个名为ServiceListener
;否则,它将使用一个名为Zend\Mvc\Service\ServiceListenerFactory
的工厂。 许多侦听器服务将添加到ServiceListener
,例如getServiceConfig
, getControllerConfig
, getControllerPluginConfig
和getViewHelperConfig
模块的getViewHelperConfig
器。
然后, ModuleManager
检索ModuleManager
服务并附加上述侦听器。 通过将“ ServiceManager”参数设置为服务管理器对象,可以创建Zend\ModuleManager\ModuleEvent
的实例。 最后,他创建Zend\ModuleManager\ModuleManager
的实例,并实现EventManager
和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
中定义,所有用户插件都必须从中继承
可视化
[我的]
- 除非另有说明,否则从上到下阅读。
- 箭头线指示所包含的内容。
- 没有箭头的细线表示连接了什么。
- 没有箭头的粗线表示要进行哪些控制。
通讯技术

方案

来自作者
细心的读者注意到,本文以Toaster的链接开头,在该链接中询问有关ServiceManager和ModuleManager之间区别的问题,文章的正文以它们开头。 巧合吗? 我不这么认为。 事实是,Habr是我开始熟悉框架基础知识的第一个地方, 出版物引起了混乱,在混乱的地方从文档中重新创建了一个博客,并附有文章作者的评论。 正是由于缺少对ModuleManager的描述,导致我做出了错误的推理(模块已在ServiceManager中注册),这导致撰写本文。
有用的链接
我不想参与复制粘贴并在一个主题上增加了6个部分,所以我在ZF上附上了我的书签列表,并附上注释:
小心扰流板!博客
在Habr的三篇文章中
原始博客文档
赛事经理
初步审查
详细分析
服务经理
快速上手
详细分析
模块管理器
该文件
我希望短暂的游览不会太长并且有用。 当然,您接受哈布规则和俄罗斯联邦现行法律允许的编辑,建议,批评和其他行动。
我们应得的奖金:
小猫咪
(= ^Ω・ ^ =)