我正在通过视图帮助器实现一个登录小部件。在创建小部件的实例时,我需要传递身份验证控制器的实例:
public function getViewHelperConfig()
{
return array(
'factories' => array(
'loginWidget' => function (???) {
$authController = ???
return new ApplicationViewHelperLoginWidget($authController);
}
)
);
}
在module.config.php
:
'controllers' => array(
'invokables' => array(
'MainControllerIndex' => 'MainControllerIndexController',
'MainControllerAuth' => 'MainControllerAuthController'
),
),
我该如何继续?
视图帮助器不应该依赖于控制器实例。你可以考虑将代码提取到一个服务中,并在视图助手和授权控制器中使用相同的服务。
以防万一这是不可能的,我发现ZF2源代码负责控制器实例化:https://github.com/zendframework/zend-mvc/blob/master/src/DispatchListener.php
我们知道控制器是通过ControllerManager
服务构建的。所以你应该能够做这样的事情。
'loginWidget' => function ($helperPluginManager) {
$authController = $helperPluginManager
->getServiceLocator()
->get('ControllerManager')
->get('MainControllerAuth')
;
return new ApplicationViewHelperLoginWidget($authController);
}
如果有人通过谷歌找到这个页面,确实需要在模块中获取控制器实例,这段代码适用于我:
public function onBootstrap(MvcEvent $e)
{
$eventManager = $e->getApplication()->getEventManager();
$eventManager->attach(MvcEvent::EVENT_DISPATCH, function($e) {
$controller = $e->getTarget();
});
}
$controller
变量现在存储一个控制器实例