如何在zendframework 2中的module.php文件中获取服务管理器对象?

时间:2012-12-18 10:54:46

标签: zend-framework2

我在ZendFramework 2模块的module.php文件中找到了以下函数。我不明白如何在这个函数中获得服务管理器的对象($ sm)?

`

public function getControllerConfig()  
    {
        return array(  
             'initializers' => array(    
                function($instance, $sm){      
                      if($instance instanceof Service\FormServiceAwareInterface){  
                        $sm = $sm->getServiceLocator();
                        $formService = $sm->get('some_service');
                        $instance->setFormService($formService);
                      }
                 },
              ),
          );
      }

`

任何人都可以解释如何在getControllerConfig函数中获取对象$ sm?

1 个答案:

答案 0 :(得分:1)

当ZF2启动mvc进程时,将首先注册所有默认服务。

查看手册,您将了解有关这些服务的更多信息:http://framework.zend.com/manual/2.0/en/modules/zend.mvc.services.html

最重要的服务之一是 ModuleManager ,它处理所有与模块相关的功能。

您可以在Zend\Mvc\Service\ModuleManagerFactory->createService()中找到 ModuleManager 启动过程。

请注意以下代码:

$serviceListener->addServiceManager(
    'ControllerLoader',
    'controllers',
    'Zend\ModuleManager\Feature\ControllerProviderInterface',
    'getControllerConfig'
);

这将调用Zend\ModuleManager\Listener\ServiceListener->addServiceManager()并保存模块名称&临时的方法名称。

然后,当触发loadModule事件时,将调用Zend\ModuleManager\Listener\ServiceListener->onLoadModule()。在此方法中,Modele->getControllerConfig()返回的所有结果都将注册为服务并放入Zend\ServiceManager\ServiceManager

最后,当您从getControllerConfig()调用服务时,将调用Zend\ServiceManager\ServiceManager->create(),实例和ServiceManager将作为参数设置为您的Closure:

foreach ($this->initializers as $initializer) {
    if ($initializer instanceof InitializerInterface) {
        $initializer->initialize($instance, $this);
    } elseif (is_object($initializer) && is_callable($initializer)) {
        $initializer($instance, $this);
    } else {
        call_user_func($initializer, $instance, $this);
    }
}

我之前写了一篇关于ZF2 Mvc process的说明,当ZF2处于beta3之下时,可能会帮助你(可以使用谷歌翻译)。