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