【问题标题】:Laravel switch between Queue and not QueueLaravel 在队列和非队列之间切换
【发布时间】:2016-08-15 22:09:07
【问题描述】:

如何在课堂中在 ShouldQueue 和 Sync 之间切换?

我们有一个端点,它接受一个参数是应该立即触发还是稍后触发。

在这两种情况下都应该执行相同的逻辑,但在一种情况下,我期望并回复,而另一种情况应该异步处理。

我知道实现“ShouldQueue”并使用“InteractsWithQueue”-Trait,但我们如何在一种情况下使用它而不在另一种情况下使用它?

您能否以编程方式设置请求是否应排队,或者是否有更好的方法来执行此操作?谢谢

【问题讨论】:

  • 我自己还没有测试过这个,但是你可以实例化作业类,如果它必须立即运行,或者“在线”,那么只需在你的控制器中调用handle() 方法吗?如果你想在队列中运行它,或者“离线”,你可以像往常一样使用调度程序来排队。
  • @xjstrategebx 是的,这行得通,但是在这两种情况下如何传递变量?在 dispatch 情况下,它应该在构造函数中,在 handle 情况下,handle 方法。
  • 如果您通过服务容器解析作业类(即$job = app(\App\Jobs\MyJob::class);),您在构造函数中键入提示的任何类都将自动为您传递。如果你手动调用handle(),并且它需要你传递参数,那么你调用它时只需传递参数。排队时无需担心这些参数 - 我相信服务容器在从队列中运行时会自动注入参数。
  • @xjstrategebx - 感谢您的努力。 Joseph Silber 有一个更好的解决方案。但是那个也应该工作。
  • 没问题,他的解决方法我也知道就好!

标签: php laravel queue jobs


【解决方案1】:

在您的控制器中:

$this->dispatch($job) // queued if implements ShouldQueue

$this->dispatchNow($job) // never queues

如果卡在 Laravel 5.1 上,请自己创建一个 Dispatcher 的新实例:

use Illuminate\Contracts\Bus\Dispatcher;

// Later ...

app(Dispatcher::class)->dispatchNow($job);

【讨论】:

  • 嗨约瑟夫,这真是太好了。 dispatchNow 不是一个函数。我还需要什么其他东西才能让它工作吗?
  • @hogan 你使用的是哪个版本的 Laravel?它至少在 5.2 中(参见 here)。它所做的只是 app(\Illuminate\Contracts\Bus\Dispatcher::class)->dispatchNow($job);
  • @hogan - 如果你从早期版本的 Laravel 升级,请务必在控制器中使用 Illuminate/Foundation/Bus/DispatchesJobs trait。
  • 哦,应该提到它是 Laravel 5.1
  • @JosephSilber - 感谢您的回答和努力!它按描述工作。
猜你喜欢
  • 2011-08-29
  • 2022-10-06
  • 1970-01-01
  • 2019-05-13
  • 2014-10-16
  • 2017-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多