zf3 onRoute事件监听器

Art*_*ida 2 event-listener zf3

我的模型中有一段代码:

public function init(ModuleManager $manager)
{
    // Get event manager.
    $eventManager = $manager->getEventManager();
    $sharedEventManager = $eventManager->getSharedManager();
    // Register the event listener method.
    $sharedEventManager->attach(__NAMESPACE__, MvcEvent::EVENT_DISPATCH, [$this, 'myFunc'], 100);
}

// Event listener method.
public function myFunc(MvcEvent $event)
{
    echo 'it works!';
    exit;
}
Run Code Online (Sandbox Code Playgroud)

侦听器被调用.虽然如果我将事件类型更改为MvcEvent :: EVENT_ROUTE,则不再调用侦听器.怎么解决?

Art*_*ida 7

所以,显然对象Zend\EventManager\EventManager为事件'dispatch'调用方法triggerListeners两次.将标识符设置为:

Array
(
    [0] => Zend\Mvc\Application
)
Run Code Online (Sandbox Code Playgroud)

和第二个标识符设置为:

Array
(
    [0] => Zend\Mvc\Controller\AbstractController
    [1] => Application\Controller\IndexController
    [2] => Application
    [3] => Zend\Stdlib\DispatchableInterface
    [4] => Zend\EventManager\EventManagerAwareInterface
    [5] => Zend\EventManager\EventsCapableInterface
    [6] => Zend\Mvc\InjectApplicationEventInterface
    [7] => Zend\Mvc\Controller\AbstractActionController
)
Run Code Online (Sandbox Code Playgroud)

因为我的监听器是为应用程序标识符定义的,所以它们在第二次调用时执 当调用'route'事件时,问题就开始了.它似乎只被调用一次,仅用于这组标识符:

Array
(
    [0] => Zend\Mvc\Application
)
Run Code Online (Sandbox Code Playgroud)

然后,路由侦听器不会被执行,因为它们的标识符只是"应用程序".要解决它就足以用Zend\Mvc\Application标识符附加它们:

$sharedEventManager->attach('Zend\Mvc\Application', MvcEvent::EVENT_ROUTE, [$this, 'myFunc'], 100);
Run Code Online (Sandbox Code Playgroud)