ZF2-如何在Module.php中检索控制器实例?
我正在通过视图助手实现一个登录小部件。创建小部件实例时,我需要传递身份验证控制器的实例:ZF2-如何在Module.php中检索控制器实例?,php,model-view-controller,zend-framework2,widget,Php,Model View Controller,Zend Framework2,Widget,我正在通过视图助手实现一个登录小部件。创建小部件实例时,我需要传递身份验证控制器的实例: public function getViewHelperConfig() { return array( 'factories' => array( 'loginWidget' => function (???) { $authController = ??? return new
public function getViewHelperConfig()
{
return array(
'factories' => array(
'loginWidget' => function (???) {
$authController = ???
return new \Application\View\Helper\LoginWidget($authController);
}
)
);
}
身份验证控制器在module.config.php
中声明:
'controllers' => array(
'invokables' => array(
'Main\Controller\Index' => 'Main\Controller\IndexController',
'Main\Controller\Auth' => 'Main\Controller\AuthController'
),
),
如何继续?视图助手不必依赖于控制器实例。您可能会考虑将代码提取到服务中,并将相同的服务应用到视图助手和AuthTebug。 为了防止出现这种情况,我找到了负责控制器实例化的ZF2源代码: 我们了解到控制器是通过
ControllerManager
服务构建的。所以你应该可以做这样的事情
'loginWidget' => function ($helperPluginManager) {
$authController = $helperPluginManager
->getServiceLocator()
->get('ControllerManager')
->get('Main\Controller\Auth')
;
return new \Application\View\Helper\LoginWidget($authController);
}
如果有人通过Google找到此页面,并且确实需要在模块中获取控制器实例,则以下代码适用于我:
public function onBootstrap(MvcEvent $e)
{
$eventManager = $e->getApplication()->getEventManager();
$eventManager->attach(MvcEvent::EVENT_DISPATCH, function($e) {
$controller = $e->getTarget();
});
}
$controller
变量现在存储控制器的一个实例。我已经测试了它,但是我得到:Zend\View\HelperPluginManager::get无法获取或创建ControllerManager的实例。我将尝试将代码移动到服务中。我进行了编辑以反映服务管理器未直接传递到此匿名工厂的事实。