0

我已经在基于 Skeleton Application 的 ZF2 应用程序中实现了一个用于用户身份验证控制的插件。

由于在 ZF2 开始时没有完全定义多个模块,我在文件夹 Application\src 中创建了 3 个名为 Admin、Application 和 User 的文件夹,它们有自己的模型、控制器、表单和命名空间。

我已经创建了名为UserAuthenticationwhich extends from的插件类,并在 Module.php 文件中Zend\Mvc\Controller\Plugin\AbstractPlugin附加了它:eventManager

public function onBootstrap(MvcEvent $e) {
    $e->getApplication()->getServiceManager()->get('translator');
    $eventManager        = $e->getApplication()->getEventManager();
    $moduleRouteListener = new ModuleRouteListener();
    $moduleRouteListener->attach($eventManager);
    var_dump('OnBootstrap');
    $eventManager->attach('dispatch', array($this, 'loadConfiguration'), 2);
}

public function loadConfiguration(MvcEvent $e) {
    $application   = $e->getApplication();
    $sm            = $application->getServiceManager();
    $sharedManager = $application->getEventManager()->getSharedManager();
    var_dump('loadConfiguration');
    $sharedManager->attach('Zend\Mvc\Controller\AbstractActionController','dispatch',
            function($e) use ($sm) {
                var_dump('attach');
                return $sm->get('ControllerPluginManager')->get('userAuthentication')->preDispatch($e);
            }
    );
}

我的问题如下:
这个插件适用于命名空间中的控制器Admin\Controller,但不适用于应用程序的控制器(命名空间Application\Controller)。这让我头疼。

正如您在代码段中看到的那样,我编写var_dump()了多个来跟踪错误,对于应用程序的控制器,这行似乎没有被执行:

$sharedManager->attach('Zend\Mvc\Controller\AbstractActionController','dispatch',
        function($e) use ($sm) {
            var_dump('attach');
            return $sm->get('ControllerPluginManager')->get('userAuthentication')->preDispatch($e);
        }
);



编辑
我找到了解决方案。
这是事件之间的优先级问题,默认情况下它们的优先级为 1。只需在此函数上添加一个附加参数:

$sharedManager->attach('Zend\Mvc\Controller\AbstractActionController','dispatch',
        function($e) use ($sm) {
            var_dump('attach');
            return $sm->get('ControllerPluginManager')->get('userAuthentication')->preDispatch($e);
        }, 2  /**<--- Priority parameter **/
);
4

0 回答 0