我已经在基于 Skeleton Application 的 ZF2 应用程序中实现了一个用于用户身份验证控制的插件。
由于在 ZF2 开始时没有完全定义多个模块,我在文件夹 Application\src 中创建了 3 个名为 Admin、Application 和 User 的文件夹,它们有自己的模型、控制器、表单和命名空间。
我已经创建了名为UserAuthentication
which 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 **/
);