【问题标题】:How can I ensure that multiple Laravel Listeners for the same event are executed and finished before starting the next one?如何确保在开始下一个事件之前执行并完成同一事件的多个 Laravel 侦听器?
【发布时间】:2020-03-25 07:53:32
【问题描述】:

我有一个 Laravel 5.7(带有 PHP 7.2)应用程序,它使用带有 Redis 队列的事件和侦听器。我有一些工作人员消耗队列并执行侦听器。

这是我在EventServiceProvider 类中的事件和听众互动:

protected $listen = [
    SavedObject::class => [
        Listener1::class,
        Listener2::class,
        Listener3::class,
    ],
];

我的问题是我需要在 Listener3 甚至执行之前执行并完成 Listener2。 Laravel 确保侦听器按顺序执行,但如果我有多个工作人员,Listener2 会被执行,在它完成之前,另一个工作人员会执行Listener3,它会破坏一切。

如何确保Listener2 在开始执行Listener3 之前完成? 也许有一种方法可以使用同一个工作人员执行同一事件的所有侦听器以确保这一点?

【问题讨论】:

  • 为什么不直接从第一个监听器中调用后续监听器呢?如果函数必须以精确的顺​​序执行,那么最好将它们包含在单个侦听器中。
  • 最好的方法是什么?因为我不想为此创建另一个 Event 类。有没有办法在另一个里面调用一个监听器?
  • 只要不让监听器排队,它们就会按照指定的顺序依次执行。

标签: php laravel laravel-5 events listener


【解决方案1】:

您可以创建一个“链”,当 Listener1 结束时触发 Listener2,然后触发 Listener3

Event::fire("Eventname", $attributes);

【讨论】:

  • 但是我可能需要不止一个事件来做到这一点,而这正是我想要避免的
  • 你能给我举个例子吗?它可以帮助我更好地理解你的任务。
  • 我认为你需要创建一个事件链,事件不与队列同步,不应该。如果你有听众的名字,我会写一个答案:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-29
  • 2020-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多