zf3 onRoute事件监听器

3

我有一个模型中的代码:

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;
}

触发了监听器。 但是,如果我将事件类型更改为MvcEvent::EVENT_ROUTE,则监听器不再被触发。如何解决?
1个回答

8

所以,显然Zend\EventManager\EventManager对象会两次调用事件'dispatch'的triggerListeners方法。第一次时,标识符设置为:

Array
(
    [0] => Zend\Mvc\Application
)

第二个是使用标识符设置的:

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
)

由于我的监听器是为应用程序标识符定义的,因此它们会在第二次调用时执行。 问题出现在“route”事件调用时。似乎只为这组标识符调用了一次。

Array
(
    [0] => Zend\Mvc\Application
)

稍后,路由监听器将不会被执行,因为它们的标识符只是“Application”。解决方法是将它们与Zend \ Mvc \ Application标识符一起附加即可:
$sharedEventManager->attach('Zend\Mvc\Application', MvcEvent::EVENT_ROUTE, [$this, 'myFunc'], 100);

感谢您。如果在function onRoute(MvcEvent $event)中使用$response->getHeaders()->addHeaderLine('Location', $uri);设置了https,那么您必须在浏览器中删除内容设置。否则,浏览器将始终尝试使用https。 - bitkorn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接