2

当我在 zf2 中跟踪代码时,我找不到应用程序服务注册的位置。这是application.php中的代码

public static function init($configuration = array())
{
    $smConfig = isset($configuration['service_manager']) ? $configuration['service_manager'] : array();
    $serviceManager = new ServiceManager(new Service\ServiceManagerConfig($smConfig));
    $serviceManager->setService('ApplicationConfig', $configuration);
    $serviceManager->get('ModuleManager')->loadModules();
    return $serviceManager->get('Application')->bootstrap();
}

代码“$serviceManager->get('Application')”用于获取Application服务。但是应用服务在哪里注册呢?

然后我发现Application服务与ZF2/library/Zend/MoudleManager中的代码行“$this->getEventManager()->trigger(ModuleEvent::EVENT_LOAD_MODULES_POST, $this, $this->getEvent())”相关/MoudleManager.php

public function loadModules()
{
    if (true === $this->modulesAreLoaded) {
        return $this;
    }

    $this->getEventManager()->trigger(ModuleEvent::EVENT_LOAD_MODULES, $this, $this->getEvent());

    /**
     * Having a dedicated .post event abstracts the complexity of priorities from the user.
     * Users can attach to the .post event and be sure that important
     * things like config merging are complete without having to worry if
     * they set a low enough priority.
     */
    $this->getEventManager()->trigger(ModuleEvent::EVENT_LOAD_MODULES_POST, $this, $this->getEvent());

    return $this;
}

另一个问题是“ModuleEvent::EVENT_LOAD_MODULES_POST,即loadModules.post。触发函数的第一个参数是函数名。那么loadModules.post是函数吗?它是在哪里定义的?

提前致谢。

4

2 回答 2

3

我先解决最后一个问题。trigger 方法的第一个参数不是函数,它只是一个名称;按照惯例,该名称通常反映触发它的方法,可以选择带有后缀以提供更多上下文(例如“.pre”、“.post”等)。

ModuleManager::loadModules()“loadModules.post”是一个在所有模块都被加载后触发的事件。当一个事件被触发时,该事件上的任何监听器都会被提供的参数触发。事件对象本身也有一个“目标”,在这种情况下是 ModuleManager。

关于“应用程序”服务,您必须查看 MVC 层的内部结构。大多数 MVC 服务在Zend\Mvc\Service\ServiceListenerFactory. 如果您查看该类,您会看到它分配Application给使用Zend\Mvc\Service\ApplicationFactory来创建应用程序实例。ServiceListenerFactory被检索为创建 ModuleManager 的工厂的一部分。这有点间接,但关系是由操作顺序和对象之间的关系定义的。

于 2013-01-17T22:31:30.927 回答
1

Zend\ServiceManager\ServiceManager 注册的服务大部分是由ServiceListener 工厂Zend\Mvc\Service\ServiceListenerFactory在创建ServiceListener 实例时配置的。

默认配置实际上存储在ServiceListenerFactory::defaultServiceConfig. (如果您浏览代码,您会看到那里定义了“应用程序”别名)

对于第二个问题, ModuleEvent::EVENT_LOAD_MODULES 只是用于标识不同模块加载事件的 ModuleEvent 常量之一。

实际上,应用程序在不同阶段触发了四个模块事件。我还没有机会使用这些事件,我认为它们主要由框架本身使用。到目前为止,我有机会只使用 Zend\Mvc\MvcEvent 相关事件。

于 2013-01-17T16:39:07.003 回答