2016-04-25 33 views
1
<?php 


namespace Inventionary; 

use Zend\Mvc\ModuleRouteListener; 
use Zend\Mvc\MvcEvent; 

class Module 
{ 
    public function onBootstrap(MvcEvent $e) 
    { 
     $eventManager  = $e->getApplication()->getEventManager(); 
     $moduleRouteListener = new ModuleRouteListener(); 
     $moduleRouteListener->attach($eventManager); 



     $eventManager->attach(MvcEvent::EVENT_DISPATCH, [$this, 'OnDispatch']); 
     $eventManager->attach(MvcEvent::EVENT_RENDER, [$this, 'OnRender']); 
    } 

    public function getConfig() 
    { 
     return include __DIR__ . '/config/module.config.php'; 
    } 

    public function getAutoloaderConfig() 
    { 
     return array(
      'Zend\Loader\StandardAutoloader' => array(
       'namespaces' => array(
        __NAMESPACE__ => __DIR__ . '/src/' . __NAMESPACE__, 
       ), 
      ), 
     ); 
    } 


    public function onDispatch(MvcEvent $e) 
    { 
     xdebug_var_dump("Route Dispatch"); 

     xdebug_var_dump($e->getRouteMatch()); 
     $e->stopPropagation(true); 

     xdebug_var_dump($e->propagationIsStopped()); 
     //return new \Zend\Http\Response(); 

    } 

    public function onRender(MvcEvent $e) 
    { 
     xdebug_var_dump("Before Render"); 
     xdebug_var_dump($e->getRequest()->getMetadata()); 
     xdebug_var_dump($e->getRouteMatch()); 

    } 
} 

我期待從來沒有看到StopPropogation()不ON_DISPATCH事件短路

「之前渲染」

但它顯示它。

如果我從onDispatch()返回Response對象,它按照預期工作。請詳細解釋爲什麼stopPropogation()不能阻止觸發onRender()回調。如何在不返回Response對象的情況下使其工作。我有點不清楚它的內部工作。

回答

1

stopPropagation()停止進一步處理附加到所述事件的聽衆,而不是完全地處理所有剩餘的事件。

+0

你能告訴返回'Response'對象和使用setPropogation()並從attatch()的回調返回false之間有什麼區別。他們都假設短路 – varuog