我在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?
答案 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之下时,可能会帮助你(可以使用谷歌翻译)。