如何在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);
}

如果有人通过谷歌找到这个页面,确实需要在模块中获取控制器实例,这段代码适用于我:

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

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