2011-03-29 49 views
7

这是一个Zend框架问题。这些ZF事件以什么顺序运行?

如果我有一个控制器,一个动作助手和插件,做他们的事件发生在什么样的顺序?下面我按照我认为它们出现的顺序列出了我感兴趣的事件。订单是否正确?

  1. 插件,routeStartup()在
  2. 插件,routeShutdown()
  3. 插件,dispatchLoopStartup()在
  4. 插件,preDispatch()方法

  5. 动作助手时,init()

  6. 动作助手,preDispatch()方法

  7. 控制器时,init()

  8. 控制器,preDispatch()方法
  9. 控制器,执行postDispatch()

  10. 动作助手,执行postDispatch()

  11. 插件,执行postDispatch()

  12. 插件,dispatchLoopShutdown()在

IT运ccurred对我说,当涉及到动作助手和控制器,一对的init()方法可以连续运行,其次是对preDispatch()方法,但我不认为是这样。

感谢您的帮助!

回答

7

有趣的问题。我认为你是正确的,除了7和6应该是对立的。为了检查它,我调试了一个ZF应用程序。这是我发现:

1. $this->_plugins->routeStartup($this->_request);   #$this is Zend_Controller_Front 

    $router->route($this->_request);      #$router is Zend_Controller_Router_Rewrite, and method route finds a matching route to the current PATH_INFO 

2. $this->_plugins->routeShutdown($this->_request);  #$this is Zend_Controller_Front 

3. $this->_plugins->dispatchLoopStartup($this->_request); #$this is Zend_Controller_Front 

4. $this->_plugins->preDispatch($this->_request);   #$this is Zend_Controller_Front 

5. $helper->init(); # exectued for helpers by Zend_Controller_Action_HelperBroker 
         # during making an instance of IndexController. 
         # Specifically for Zend_Controller_Action_Helper_ViewRenderer 
         # and Zend_Layout_Controller_Action_Helper_Layout 


// IndexControlles has just been instantiated 


6. $this->init();      # $this is IndexController 

7. $this->_helper->notifyPreDispatch(); # $this is IndexController 

8. $this->preDispatch();     # $this is IndexController 

    $this->$action();      # $this is IndexController (action executed) 

9. $this->postDispatch();    # $this is IndexController 

10. $this->_helper->notifyPostDispatch(); # $this is IndexController 


// Execution of IndexController has just finished 


11. $this->_plugins->postDispatch($this->_request); #$this is Zend_Controller_Front 

12. $this->_plugins->dispatchLoopShutdown();   #$this is Zend_Controller_Front 


// after that response is sent 

$this->_response->sendResponse();     #$this is Zend_Controller_Front 

希望这会有所帮助。

+0

谢谢Marcin,这太棒了! – 2011-03-29 21:33:55

相关问题