使用Zend框架,我想在我的应用程序/模块上附加一个事件,这样在每个dispach事件上,每个模块都会调用这个函数。这是我的代码:
class Module
{
public function getConfig()
{
return include __DIR__ . '/../config/module.config.php';
}
public function onBootstrap(MvcEvent $event)
{
$application = $event->getApplication();
$serviceManager = $application->getServiceManager();
$sessionManager = $serviceManager->get(SessionManager::class);
// Get event manager.
$eventManager = $event->getApplication()->getEventManager();
$sharedEventManager = $eventManager->getSharedManager();
// Register the event listener method onDispatch
$sharedEventManager->attach(AbstractActionController::class,
MvcEvent::EVENT_DISPATCH, [$this, 'onDispatch'], 100);
}
public function onDispatch(MvcEvent $event)
{
// Will perform application wide ACL control based on controller,
// action and user data.
}
}
由于某种原因,我的onDispatch从未被调用,即使应用程序屏幕已经加载。
不知道我错过了什么。据我所知,我需要使用共享事件管理器才能对整个应用程序有效。
1条答案
按热度按时间e5njpo681#
要做到这一点(监听MVC事件),你不需要共享事件管理器,而是MVC事件管理器。像这样修改你的代码,它会像预期的那样工作:
另请参阅this great blog post,了解何时使用共享事件管理器的更多详细信息。这篇博客文章也解释了这个特殊的案例:
MVC事件的特殊情况
我之前说过我们应该使用共享事件管理器。但有一个具体的案例:我们从
onBootstrap
方法获取的事件管理器是MVC事件管理器。这意味着这个事件管理器知道框架触发的事件。这意味着如果你想给Zend\Mvc\MvcEvent
类的事件添加监听器,你可以不使用共享事件管理器来完成: