我试图围绕Laravel的queued event listener vs jobs。
对我而言,似乎两者非常相似:
ShouldQueue
接口(在事件监听器的情况下,这是一个选项)handle()
和failed()
(可选)方法来执行各自的任务。基本上,对我来说,两者都是可以异步运行的排队项目。
到目前为止,我能够区分的是,作业有更多"高级" 功能/配置,例如$timeout
,$tries
属性,您可以也延迟了“触发器”工作(由Illuminate\Bus\Queueable
特质提供)。
我确信还有更多,但我指出了那个突然出现的那个。
所以,问题是,两者之间的实际差异是什么,更重要的是,你何时优先于另一方?
答案 0 :(得分:1)
好问题,我将从laravel docs如何解释它开始
事件:Laravel的事件提供了一个简单的观察者实现,允许您订阅和侦听应用程序中发生的各种事件。事件是解耦应用程序各个方面的好方法,因为单个事件可以有多个不依赖于彼此的侦听器。
在哪里
作业:作业类非常简单,通常只包含一个句柄方法,当队列处理作业时会调用该方法。
基本上两者都是把工作推到队列和/或做一些处理它要求做的事情,我要说的主要区别是如何调用它们。
事件在了望台上被称为,其中乔布斯始终明确地称为。
事件的力量是我们可以为单个事件注册 多个侦听器 , 事件助手会将事件分派给所有已注册的事件听众 ,我们没有将他们称为 。在乔布斯的情况下,我们必须明确地将它们称为每一个。
简而言之,如果您有一个事件会触发多个方法调用事件会有所帮助。如果它的单一方法调用乔布斯是好的。
活动场景:用户注册 - >发送电子邮件,Dispatch免费赃物,为用户个人资料userxyz.site.com等创建子域名
职位情景:用户注册 - >发送电子邮件。
答案 1 :(得分:1)
嗯,它们非常相似,eventlistener在handle方法中将事件作为参数,而作业则没有。
在要将触发部分与操作部分分离的情况下,事件很好。例如,当您在项目中有多个模块,而您希望一个模块对另一个事件做出反应时。
与工作相比,事件的一个限制是工作链。例如,如果您从某个控制器触发了多个事件,则不能确定该工作程序是按顺序分派这些事件的,并且第一个事件是在另一个事件开始之前完成的。
在这些(罕见)情况下,有时我会遇到(非排队)侦听器,这些侦听器依次调度(排队的)完成实际工作(链接或取消链接)的工作。