2017-02-10 224 views
0

我有一段代码在我的模型:ZF3 onRoute事件侦听器

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,那么不会再调用侦听器。如何解决它?

回答

2

因此,显然对象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 
) 

因为我的听众是因为他们是第二个呼叫过程中执行的应用程序标识符定义。 当呼叫'路由'事件时,问题就开始了。好像它被称为只有一次,只为这组标识符:

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

再后来,路线听众不被执行,因为他们的标识仅仅是“应用程序”。使用Zend \ Mvc \ Application标识符来解决这个问题就足够了:

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