我有一个事件,有一群排队的听众。我无法运行sync
,因为我正在调用外部API等
Events\Invoice\InvoiceEvent::class => [
Listeners\Invoice\Listener1::class, // should queue
Listeners\Invoice\Listener2::class, // should queue
Listeners\Invoice\Listener3::class, // Should NOT queue......
Listeners\Invoice\Listener4::class, // should queue
Listeners\Invoice\Listener5::class, // should queue
],
从控制器方法调用此事件。
public function store(Request $request)
{
$invoice = Invoice::findOrFail($request->id);
InvoiceEvent::dispatch($invoice); // Async event, it cannot be sync
return $invoice; // need to return only when Listener3 finish execution
}
return $invoice
依赖于Listener3,否则它将返回不完整的数据。
在完成执行 Listener3时,如何只返回Listener3?
我想出了sleep(10);
,但这不是一个理想的解决方案。
Listener3
将数据从第三方API保存到需要返回的发票表中,这就是为什么不能返回不完整的发票数据的原因,现在所需的数据被添加到发票中,但在它返回之后。
发布于 2022-09-15 23:10:23
PHP本身是同步的。除非您将这些事件或侦听器推入队列(即class Listener3 implements ShouldQueue
),否则它们应该按顺序运行。但是,您可能需要重新考虑代码的结构。
侦听器最好是对事件的反应,即副作用,独立于应用程序的其余部分运行。作业、事件和侦听器一般不应返回值(除非halt
返回一系列侦听器)。在您的例子中,发票正在经历多个步骤,包括调用第三方API。想法:
$invoice
数据到前端)发布于 2022-09-19 11:52:32
有一种方式可以广播你的事件而不是排队,
在事件类中添加:
use Illuminate\Contracts\Broadcasting\ShouldBroadcastNow;
因此,类声明必须实现ShouldBroadcastNow
。
class NotQueueEvent implements ShouldBroadcastNow { ... }
此扩展事件不带队列。
发布于 2022-09-06 10:54:36
如果要等待此方法返回,则不应将其放在队列中。运行事件并等待返回。不知道我是否正确地理解了这个问题。
https://stackoverflow.com/questions/73626415
复制