我想知道 Laravel 5.1 中的不同类命令之间有什么区别。据我所知,Laravel 5.1 可用以下命令:
- 控制台命令(
artisan make:console
) - 命令(
artisan make:command
)- 处理器(
artisan make::command --handler
)
- 处理器(
- 作业(
artisan make:job
)
我是直接从4.2升级到5.1的,所以不知道4.2和5.1之间发生了什么,但我已经听说中间那个(仅仅是命令)基本上不再使用了 - 它们在队列化作业成为“命令”时出现在5.0中,但Laravel后来反对这一点,它们只是为了兼容性而存在。然而,我对此并不100%确定,希望能得到澄清。
我的具体用例是,我想要一个地方放置一个自包含的“可运行”任务。例如,从给定目录中删除早于5天的文件(但它可以执行任何操作)。
起初这听起来像是一个控制台命令 - 我想要能够从 artisan
运行它,首先。但我可能也想在时间表上运行它(非常好,artisan schedule:run
运行控制台命令)。但我也可能想要异步地从代码中执行它。控制台命令可以使用 synchronously 来运行 Artisan::call()
,但对于异步来说,这是(我认为)队列派上用场,而它突然变成了一个作业。
好的,我们有一个任务。我们现在可以从代码中将它添加到队列中,但是如何将其作为artisan命令(同步)执行?我是否只需创建一个轻量级控制台命令,并添加DispatchesJobs
特征(或其中的代码),然后调度该任务?任务总是必须进入队列中吗,还是我们可以使任务同步执行(并最好输出到控制台命令的输出中)?对于定时运行它的方式也是同样的问题-我应该创建这个控制台命令并将其添加到计划程序中,还是可以直接让计划程序运行任务?
最后,我们有“命令”既不是控制台命令,也不是任务。正如我之前所说,人们告诉我这些只是Laravel 5.0代码更改的附带影响(有点)被撤销了。但是artisan make
命令仍然存在于它们身上,所以它们不能太过时。此外,“自处理命令”(默认情况下带有handle
方法)和“需要”处理程序类的命令(运行artisan make:command --handler
)是什么意思?你如何实际执行这些命令?手动使用(new App\Command\SomeCommand)->handle();
或(new App\handlers\SomeCommandHandler)->handle(new App\Command\SomeCommand)
,还是有一些我不知道的隐藏系统(也许它们可以使用作业/队列调度程序进行调度)?此外,您可以创建“排队”命令artisan make::command --queued
,那么这些命令有何不同呢?
我想我的问题归结为以下几点:
- 它们之间的真正(语义和功能)区别是什么?
- 运行它们的正确方法是什么?
- 对于我需要以任何我觉得适当的方式运行的基本独立代码来说,哪种方法最好?
我在文档中找到了如何使用队列和创建控制台命令的信息,但没有关于何时使用它们或有关命令类和处理程序的详细信息。
相关但不完全相同(而且没有答案):Laravel 5.1 命令和作业
ShouldQueue
接口,因为它会使我的作业始终排队,即使我不总是需要。但是我仍然可以排队没有ShouldQueue
的作业,对吗? - alexrusselldispatchNow
,我确实在我的控制台命令中使用了它,但我没有意识到我可以反转这种行为。谢谢你,这非常有帮助。 - alexrussell