ZF2 - 如何在Module.php中检索控制器实例?

时间:2015-08-23 10:05:02

标签: php model-view-controller zend-framework2 widget

我正在通过视图助手实现一个登录小部件。我需要在创建窗口小部件的实例时传递我的身份验证控制器的实例:

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'
    ),
),

我该怎么办?

2 个答案:

答案 0 :(得分:2)

视图助手不应该依赖于控制器实例。您可以考虑将代码提取到服务中,并将相同的服务用于视图助手和auth控制器。

为了防止这种情况发生,我找到了负责控制器实例化的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);
}

答案 1 :(得分:0)

如果有人通过Google查找此页面并且确实需要获取模块中的控制器实例,则此代码适用于我:

public function onBootstrap(MvcEvent $e) 
{   
    $eventManager = $e->getApplication()->getEventManager();
    $eventManager->attach(MvcEvent::EVENT_DISPATCH, function($e) {
        $controller = $e->getTarget();
    });
}

$controller变量现在存储控制器的一个实例。