CakePHP事件调度程序可以从多个处理程序返回结果吗?

时间:2014-02-05 16:19:22

标签: events cakephp handler

我只是在CakePHP中实现了一个事件处理程序并且运行良好,但后来我考虑为同一个事件添加2个事件处理程序,并意识到我只能从一个处理程序返回数据。有多个处理程序坏了或者只是CakePHP的限制?问题出在CakeEventManager.php调度例程中,它通过侦听器循环,结果只是在$ event->结果中相互覆盖。

public function dispatch($event) {
    ...

    foreach ($this->listeners($event->name()) as $listener) {
        ...

        if ($result !== null) {
            $event->result = $result;
        }
        continue;
    }
}

有没有更好的方法来返回结果?在我的情况下,我想在“之前”事件中打开一个套接字,发送一些数据,在“之后”事件中关闭套接字。最初我以为我可以将套接字保存在具有回调的模型对象中,但是由于处理程序的调用方式而得到错误“在不在对象上下文中时使用$ this”。如果我只有一个处理程序,我可以返回套接字,但如果有多个处理程序,则调用的最后一个处理程序可能会返回覆盖套接字的内容。

快速破解就是将其改为

$event->result[] = $result;

评论?感谢

1 个答案:

答案 0 :(得分:0)

我想我找到了自己的答案。根据文档,我应该在处理程序中直接设置$ event-> result ['somevar'],只要另一个事件不使用相同的密钥,它就不会被覆盖。就我而言,我保存了套接字,然后将其传递给未来的事件:

        $event = new CakeEvent('Model.Label.beforeFormat', $this, array(
                'barcodePrinter' => $barcodePrinter,
                'labelData' => $labelData,
                'numRows' => $qty,
                'row' => $i,
                'eventData' => $eventData,
        ));
        $this->getEventManager()->dispatch($event);
        if (is_array($event->result)) {
            $eventData = array_merge($eventData, $event->result);
        }