Php Zend Framework 2中服务类和管理类之间的差异

Php Zend Framework 2中服务类和管理类之间的差异,php,zend-framework2,naming-conventions,Php,Zend Framework2,Naming Conventions,我对管理器和服务类名后缀有点困惑 就我所理解的差异而言,经理负责处理(创建、检索、删除等)某些类型的实体。例如,ModuleManager负责加载和返回模块。在本例中,您确实关心实际的实体,模块 然而,服务是提供接口以执行不同类型的流程逻辑的类。例如,LogService向定义的日志编写器发送给定的日志消息。你不在乎它去哪里,做什么,你只想让管理员知道刚刚发生的事情 现在,ZF2提供了一个ServiceManager,它创建并返回给定服务的实例。我无意中习惯了创建管理器并向服务管理器提供工厂,以

我对
管理器
服务
类名后缀有点困惑

就我所理解的差异而言,
经理负责处理(创建、检索、删除等)某些类型的实体。例如,
ModuleManager
负责加载和返回
模块
。在本例中,您确实关心实际的实体,
模块

然而,
服务
是提供接口以执行不同类型的流程逻辑的类。例如,
LogService
向定义的日志编写器发送给定的日志消息。你不在乎它去哪里,做什么,你只想让管理员知道刚刚发生的事情

现在,ZF2提供了一个
ServiceManager
,它创建并返回给定
服务的实例。我无意中习惯了创建
管理器
并向
服务管理器
提供
工厂
,以便您可以使用
$this->getServiceLocator()->get('managerName')访问
管理器
控制器
上下文中的code>,以保持控制器很小,并且在可测试类中保持真实逻辑。这是目前让我感到困惑的部分,因为显然,不建议使用
ServiceLocator
检索
Managers
但是:我不是唯一一个这样做的人:
条令ORM
模块是另一个例子:默认情况下,它将
EntityManager
注册为
条令.EntityManager.ORM_默认值
服务


我是否理解了
服务
经理
之间的真正区别?有什么区别吗?
管理者
在概念上是否可能从
服务
继承而来?

我将尝试为您分析ZF2中的管理者和服务

管理者 不幸的是,类中的“manager”一词非常模糊,在ZF2中,这个词的用法有点不一致。因此,对于ZF2中的“管理者”实际上没有权威定义。目前,ZF2中的“经理”最好按如下方式分解:

  • ServiceManager-Zend\ServiceManager\ServiceManager
的实例。可以有多个ServiceManager实例——默认情况下,只有“main”服务管理器,它由“services”配置键或由模块的getServiceConfig()方法返回的数组配置
  • 插件管理器-这些扩展了
    Zend\ServiceManager\PluginManager
    ,它扩展了
    Zend\ServiceManager\ServiceManager
    ,具有一些专门的功能。这些插件分布在框架中的许多组件中,并提供了以前称为插件加载程序/代理的功能(在早期版本的ZF2中)。这些插件管理器是什么样的初始化东西,和
  • 其他“管理者”-如
    Zend\ModuleManager\ModuleManager
    Zend\Session\SessionManager
    。它们与ServiceManager无关,只是碰巧在名称后面加了“Manager”
  • 我想你可能会感到困惑,试图给一个术语(经理)下一个定义,而这个术语的设计并没有考虑任何具体的定义。作为
    Zend\ModuleManager
    的作者,我可以告诉您,我最初将组件开发为
    Zend\Module
    (我真的不喜欢将Manager作为后缀)。在中确定,
    Zend\Module
    是不明确的,在它后面加上“Manager”将以某种方式解决这种不明确的问题。很明显,我在这件事上落选了。我的观点是,
    Zend\ModuleManager
    没有按照任何定义发展成为“管理者”

    服务 在ZF2中,对于
    Zend\ServiceManager
    ,“服务”只是对象(从技术上讲也可以是数组)。ServiceManager组件可以看作是应用程序可能需要的各种“服务”(对象)的简单键值注册表。这些“服务”通常是配置好的邮件程序、记录器、数据库适配器、应用程序配置等。当然,ServiceManager不仅仅是一个简单的注册表,它的主要功能是推迟服务(及其依赖项)的实例化,直到实际需要它们为止;又称惰性加载);我写了一封信

    我无意中习惯了创建管理器并向ServiceManager提供工厂,这样您就可以使用$this->getServiceLocator()->get('managerName)访问管理器

    我想在这种情况下,你可能会把这里的“经理”和“服务”混淆了。向ServiceManager注册的内容可以简单地称为“服务”。这可能会让人困惑,因为您确实可以将某种“经理”注册为服务。例如,您可以拥有一个“会话”服务,它是
    Zend\session\SessionManager
    的实例。进一步的混淆随之而来,因为术语“服务”通常指的是构成服务的一部分的类

    因此,不幸的是,ZF2中的术语可能有点模糊,但一旦您理解了两个相对简单的核心概念,伟大的设计确实带来了一些惊人的灵活性,在我看来,这是其他大多数现有框架所无法比拟的


    希望这有帮助。

    Evan,谢谢你的回答,这很有帮助!现在,我必须考虑如何命名“经理”在未来和如何处理我现有的,但这很好。谢谢这是非常清楚的,我建议在ZF2文档的介绍中包含在一个名为“ZF2术语”或类似的段落中