我只是在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;
评论?感谢
答案 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);
}