控制台命令
Laravel 拥有控制台“命令”已经有一段时间了。它们基本上没有变化,并且像往常一样工作。简单来说,它们相当于命令行的路由——应用程序的入口点。他们与……没有任何关系。
命令总线
Laravel 5.0 引入了一个实现Command Bus
模式 - 命令总线命令。 (我相信这些被重命名为 Jobs 是因为它们和 CLI 命令之间产生了混淆)。
命令总线分为两部分:一个表示要执行的命令的对象,以及它所需的所有数据(作业),以及一个执行命令的类(处理程序)。
处理程序
在 Laravel 中,您可以将作业声明为自我处理 - 也就是说,它本身有一个 handle 方法。
如果要注册命令处理程序,可以在服务提供者中调用以下命令:
app('Illuminate\Bus\Dispatcher')->maps(['Job' => 'Handler']);
其中 Job 是作业的类名称,Handler 是处理程序的类名称。
laravel 5.0 中的 handlers 目录是隐式声明这些关系的一种方式(即EmailCommand
在命令文件夹中会有一个EmailCommandHandler
在处理程序文件夹中)。
发送命令
您可以使用以下命令来调度命令。
app('Illuminate\Bus\Dispatcher')->dispatch(new EmailPersonCommand('[email protected] /cdn-cgi/l/email-protection', $otherdata));
Queues
默认情况下,作业一旦被调用(或分派)就会立即运行。将它们设置为ShouldQueue
当它们被调度时,总是将它们传递到队列中。
如果您有时想同步运行它们,有时想异步运行它们,您可以调用$dispatcher->dispatchToQueue($job)
当您希望它们排队时。这就是当你传递一个时内部发生的所有事情ShouldQueue
job to ->dispatch()
.
编辑:排队(或不排队)
我刚刚对调度员进行了更长时间的观察。这dispatch
方法检查命令是否是ShouldQueue
,并将其转发到dispatchToQueue
or dispatchNow
。您可以直接调用这些方法中的任何一个,而不是dispatch
如果您希望覆盖默认行为,请使用您的命令。
因此,在您的情况下,取决于您的作业的“默认”行为(即它通常会排队吗?):
- 有它ShouldQueue
,并使用dispatchNow
在 CLI 命令中。
- 没有ShouldQueue
,并使用dispatchToQueue
你在代码中调用它的地方。
从声音来看,我会做前者。