【问题标题】:zf2 dispatch event triggered after my own?zf2 dispatch event 在我自己之后触发?
【发布时间】:2014-06-05 11:01:19
【问题描述】:

为什么调度事件在我的控制器之后触发?

onBootstrap:

$sharedManager->attach('*', '*', function($e) {
    Debug::dump($e->getName());
});

索引操作:

$this->getEventManager()->trigger(__FUNCTION__ . '.pre', $this);
Debug::dump('indexAction do...');
$this->getEventManager()->trigger(__FUNCTION__ . '.post', $this);

结果是:

string(5) "route"
string(15) "indexAction.pre"
string(17) "indexAction do..."
string(16) "indexAction.post"
string(8) "dispatch"
string(8) "dispatch"
string(6) "render"
string(8) "renderer"
string(13) "renderer.post"
string(8) "renderer"
string(13) "renderer.post"
string(8) "response"
string(6) "finish"
string(12) "sendResponse"

我找到了调度过程: https://docs.google.com/drawings/d/1OwFfjgaiXDuKmS2I8nnJNFqoDgEWNNB-_-tUXUPVrgQ/edit 但是好像不正确

我以为dispatch事件会被触发为dispatch.pre,而不是dispatch.post...

【问题讨论】:

  • 有趣;刚刚试了一下,得到了相同的结果。

标签: events zend-framework2 dispatch


【解决方案1】:

你的调试方法给了你奇怪的结果。

通过添加具有默认事件优先级(即1)的“调试侦听器”,事件名称的输出实际上发生在调度事件发生之后

这是因为 ZF2 首先注册了控制器的 dispatch 事件(事件优先级也为 1)。所以事件发生的顺序是正确的;只是你的听众在错误的时间输出

Zend\EventManager\EventManager::trigger()加一行可以测试事件的顺序

// Zend\EventManager\EventManager
public function trigger($event, $target = null, $argv = array(), $callback = null)
{
    echo '<br>Triggered: ' . $event;
    //...
}

此输出(不包括模块引导位)

Triggered: bootstrap
Triggered: route
Triggered: dispatch // MVC dispatch
Triggered: dispatch // Action Controller disaptch
Triggered: foo.pre  // Controller custom events
Triggered: foo.post // Controller custom events
Triggered: render
Triggered: renderer
Triggered: renderer.post
Triggered: renderer
Triggered: renderer.post
Triggered: response
Triggered: finish

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-18
    • 1970-01-01
    • 1970-01-01
    • 2014-05-20
    • 1970-01-01
    • 1970-01-01
    • 2020-11-11
    • 2011-07-07
    相关资源
    最近更新 更多