0

我在 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 ?

4

1 回答 1

1

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

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

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

可以在Zend\Mvc\Service\ModuleManagerFactory->createService().

注意这些代码:

$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 作为参数设置到您的闭包中:

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);
    }
}

我之前在beta3下ZF2时写了一篇关于ZF2 Mvc过程的笔记,也许可以帮助你(可以使用谷歌翻译)。

于 2012-12-19T06:18:08.327 回答