ZF2 - 如何在 Module.php 中检索控制器实例?
ZF2 - How to retrieve a controller instance in Module.php?
我正在通过视图助手实现登录小部件。我需要在创建小部件实例时传递我的身份验证控制器的实例:
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'
),
),
我该如何继续?
视图助手不应依赖于控制器实例。您可能会考虑将代码提取到服务中,并将相同的服务用于视图助手和身份验证控制器。
以防万一,我找到了负责控制器实例化的 ZF2 源代码:
https://github.com/zendframework/zend-mvc/blob/master/src/DispatchListener.php
我们了解到控制器是通过 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
变量现在存储控制器的一个实例。
我正在通过视图助手实现登录小部件。我需要在创建小部件实例时传递我的身份验证控制器的实例:
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'
),
),
我该如何继续?
视图助手不应依赖于控制器实例。您可能会考虑将代码提取到服务中,并将相同的服务用于视图助手和身份验证控制器。
以防万一,我找到了负责控制器实例化的 ZF2 源代码: https://github.com/zendframework/zend-mvc/blob/master/src/DispatchListener.php
我们了解到控制器是通过 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
变量现在存储控制器的一个实例。