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

问题描述 投票:0回答:1

我刚刚在 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;

评论?谢谢

php events cakephp handler
1个回答
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);
        }
© www.soinside.com 2019 - 2024. All rights reserved.