我刚刚在 CakePHP 中实现了一个事件处理程序,它运行良好,但后来我考虑为同一事件添加 2 个事件处理程序,并意识到我只能从一个处理程序返回数据。拥有超过 1 个处理程序是不好还是这只是 CakePHP 中的一个限制?问题出在 CakeEventManager.php 调度例程中,它循环遍历侦听器,结果在 $event->result 中相互覆盖。
public function dispatch($event) {
...
foreach ($this->listeners($event->name()) as $listener) {
...
if ($result !== null) {
$event->result = $result;
}
continue;
}
}
有没有更好的方法返回结果?就我而言,我想在“之前”事件中打开套接字,发送一些数据,然后在“之后”事件中关闭套接字。最初,我认为我可以将套接字保存在具有回调的模型对象中,但由于调用处理程序的方式,出现错误“不在对象上下文中时使用 $this”。如果我只有一个处理程序,我可以返回套接字,但如果有多个处理程序,则调用的最后一个处理程序可能会返回覆盖套接字的内容。
一个快速破解方法是将其更改为
$event->result[] = $result;
评论?谢谢
我想我找到了自己的答案。根据文档,我应该直接在处理程序中设置 $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);
}