Laravel:等待特定的排队侦听器完成,然后返回

Laravel wait for a specific queued listener to finish then return

提问人:Gammer 提问时间:9/7/2022 最后编辑:Gammer 更新时间:9/20/2022 访问量:1164

问:

我有一个活动,里面有一堆排队的听众。我无法运行,因为我正在调用外部 API 等sync

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 执行完毕返回?

我想出了,但这不是一个理想的解决方案。sleep(10);

Listener3 将数据从第三方 API 保存到需要返回的发票表中,这就是为什么无法返回不完整的发票数据的原因,现在所需的数据被添加到发票中,但在返回后

PHP Laravel-5 事件

评论

0赞 Maksim 9/7/2022
嗯,你尝试在同步流中制作异步事件?这真的不是理想的解决方案:)
0赞 Haseeb Zulfiqar 9/19/2022
无论您尝试在 Listener3 中执行什么操作,都可以在服务方法中执行,或者在同步行为的同一控制器中执行。

答:

-1赞 Samuel Lujan 9/7/2022 #1

如果你想等待这个方法返回,你只应该不要把它放在队列中。运行事件并等待返回。不知道我是否正确理解了这个问题。

评论

0赞 Gammer 9/7/2022
不能等待返回,这是PHP,我认为这在PHP中是不可能的。
2赞 Erin 9/16/2022 #2

PHP 是原生同步的。除非您将这些事件或侦听器推送到队列中,否则它们应该按顺序运行。但是,您可能需要重新考虑代码的结构。class Listener3 implements ShouldQueue

侦听器最好作为对事件(即副作用)的反应,独立于应用程序的其余部分运行。作业、事件和侦听器通常不应返回值(一系列侦听器除外)。在您的情况下,发票将经历多个步骤,包括调用第三方 API。想法:halt

  1. 创建一个服务类,用于执行 Invoice 上的任务,并在完成后将发票返回给控制器(然后将数据返回到前端)$invoice
  2. 如果希望进程异步,请考虑使用推送通知。分派一个作业,在发票上执行任务,然后在发票准备好提取时提醒前端(例如 Pusher)。
0赞 Aloiso Junior 9/20/2022 #3

有一种方法可以广播您的事件,而不是排队,

在事件类中添加:

use Illuminate\Contracts\Broadcasting\ShouldBroadcastNow;

所以你的类声明必须实现ShouldBroadcastNow

class NotQueueEvent implements ShouldBroadcastNow { ... }

此 SPREAD 事件没有排队。