Laravel 命令和作业

2024-02-22

我想知道 Laravel 5.1 中不同的类似命令的类之间有什么区别。据我所知 Laravel 5.1 有以下可用:

  • 控制台命令(artisan make:console)
  • Commands (artisan make:command)
    • 处理程序 (artisan make::command --handler)
  • Jobs (artisan make:job)

我直接从 4.2 升级到 5.1,所以我不知道 4.2 和 5.1 之间发生了什么,但有人告诉我中间的(just命令)基本上不应该再使用了——它们是从可队列作业在 5.0 中成为“命令”时开始的,但 Laravel 决定不这样做,它们只是为了兼容性。然而,我在这一点上并不是 100%,所以希望能得到澄清。

我的具体用例是我想要一个放置独立“可运行”任务的地方。例如,可以从给定目录中删除超过 5 天的文件(但它可以执行任何操作)。

起初这听起来像是一个控制台命令 - 我希望能够从以下位置运行它artisan, 作为一个开始。但我可能也想按计划进行(太好了,artisan schedule:run运行控制台命令)。但我可能还想从代码异步执行它。可以运行控制台命令同步地 with Artisan::call(),但对于异步来说,(我认为)这就是队列的用武之地,它突然必须成为一项工作。

好吧,我们有工作了。我们现在可以从代码将其添加到队列中,但是如何将其作为 artisan 命令(同步)执行?我可以创建一个瘦控制台命令并添加DispatchesJobs特征(或其中的代码),然后分派作业?该作业是否总是必须进入队列,或者我们可以使作业同步执行(并且理想情况下,输出到控制台命令的输出?)同样的问题也适用于按计划运行它 - 我应该创建这个控制台吗命令并将其添加到调度程序中,或者我可以让调度程序直接运行作业吗?

最后,我们的“命令”既不是控制台命令,也不是作业。正如我之前所说,人们告诉我这些只是 Laravel 5.0 代码更改(有点)恢复的结果。但是artisan make命令对他们来说仍然存在,所以他们不能that死的。另外,自我处理命令(默认情况下带有一个handle方法)和一个“需要”处理程序类(运行artisan make:command --handler)?你实际上如何让这些执行?手动与(new App\Command\SomeCommand)->handle(); or (new App\handlers\SomeCommandHandler)->handle(new App\Command\SomeCommand),或者是否有一些我不知道的隐藏系统(也许可以使用作业/队列调度程序来调度它们)?您还可以创建“排队”命令artisan make::command --queued,那么它们又有什么不同呢?

我想我的问题可以归结为以下几点:

  • 什么是真实的(语义and功能)它们之间的区别?
  • “运行”它们的正确方法是什么?
  • 对于需要以我认为合适的方式运行的一般独立的代码来说,哪一个最适合我的目的?

我在文档中找到了有关如何使用队列和创建控制台命令的信息,但没有任何关于何时使用它们的信息,也没有关于命令类和处理程序的任何信息。


相关但不完全相同(也没有答案):Laravel 5.1 命令和作业 https://stackoverflow.com/questions/31995183/laravel-5-1-commands-and-jobs


控制台命令

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你在代码中调用它的地方。

从声音来看,我会做前者。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Laravel 命令和作业 的相关文章

  • 在 Laravel 中使用块或游标优化代码

    我有Company型号和Contact我的模型中定义的Laravel 5 4应用程序中 两者具有多对多的关系 因此 例如联系人模型具有 public function company return this gt belongsToMany
  • 我可以在 Laravel 5.2 中创建一个继承自 User 的新类吗?

    我对 Laravel 还很陌生 使用的是迄今为止的最新版本 5 2 因此我遇到了以下困境 我知道 Laravel 附带了一个User开箱即用的类 但我想开发一个系统 在其中我可以有另外两种类型的用户 称为Researcher and Adm
  • 暂时禁用/绕过中间件

    在我的应用程序中 我实现了 OAuth2 服务器 oauth2 服务器 laravel https github com lucadegasperi oauth2 server laravel 与自定义身份验证包 Cartalyst 的哨兵
  • Laravel 中的支付网关回调时会话会自动销毁

    我正在尝试将 CCavenue com 支付网关集成到我的 Laravel 7 项目中 我面临的唯一问题是在回调 url 中 从支付网关获取发布数据后 活动会话会自动销毁 我还向中间件添加了 CSRF 例外 PayController 生成
  • Laravel MySQL 按计数排序

    我正在使用 Laravel 和 MySQL 并且我有一个表post代表用户可以评论的帖子 现在我想按照每个帖子的评论数量按升序 降序对帖子进行排序 我该如何在 Laravel 中执行此操作 我不想添加字段post表来跟踪每个帖子的评论数量
  • Composer 安装要求

    我正在尝试将 Composer 安装到 Laravel 项目中 当我做的时候sudo composer install在项目目录中它显示了两个错误 Problem 1 Installation request for simplesoftw
  • Laravel Homestead 中 npm 安装错误有解决方案吗?

    Windows 10 家园 虚拟盒6 0 8 流浪者2 2 5 节点 v12 5 0 npm v6 10 1 我想做的就是在新安装的 Laravel 应用程序中执行 npm install 命令 但我不断收到错误 经过两天的谷歌搜索并尝试了
  • 将 Laravel 集合/数组转换为 Javascript 数组

    我想将 Laravel 中的数组分配给 JavaScript 数组 我已经从我的AppServiceProvider和 json decoded 它像 View composer function view users Users all
  • laravel 5.3 新的 Auth::routes()

    最近开始使用laravel 5 3写博客 但是运行后出现一个问题php artisan make auth 当我运行这个时 它会在我的web php 这是其中的代码 Auth routes Route get home HomeContro
  • laravel中过滤后如何导出excel?

    我想仅导出视图刀片中过滤的数据 我正在使用 Laravel 7 和 maatwebsite excel 3 1 和 PHP 7 4 2 我浏览了文档并应用了这个 View a href class btn btn success i cla
  • 如何在 Laravel Mix 中将公共路径更改为包含下划线的路径?

    Laravel 5 4 中引入了 Mix 来编译资产并维护资产管道 Mix 默认为您的公共目录被命名public 在许多情况下 包括我的 我的公共目录被称为其他名称 就我而言 是public html 如何更改资源编译到的公共目录 我尝试过
  • Laravel Passport,通过密码客户端进行多个连接

    我无法理解如何使用 Laravel Passport 通过密码客户端为同一用户实现多个连接 我有一个移动应用程序 需要与基于 Laravel 的 API 进行通信 我的用户在首次启动应用程序时必须输入他们的login and passwor
  • cURL 错误 77:设置证书验证位置时出错:CAfile

    我正在使用 Firebase php SDKlink https firebase php readthedocs io en latest index html并在 Windows 10 上的 XAMPP 服务器上使用 laravel 最
  • 如何从导出的 csv 文件中删除双引号

    我正在使用 Laravel 5 8 并且添加了 Maatwebsite 包 用于从数据库表导出 CSV 文件 这是我导出的类 class ConfirmedExport implements FromCollection WithHeadi
  • Laravel 广播:通知与事件

    我阅读了 laravel 文档Events and Notifications 似乎我们可以触发一个事件 并从该事件中触发 使用ShouldBroadcast接口 将其广播到我理解的 laravel echo 另一方面我们可以使用通知via
  • Laravel 按动态 ID 数组对集合进行排序 [重复]

    这个问题在这里已经有答案了 我有以下 people array 5 2 9 6 11 people collection People find people 但当我倾倒并死去时 people collection集合按 ID ASC 排序
  • 如何使用 then() 将 Fetch 响应的 JSON 正文传递给 Throw Error()?

    EDIT 你误会了 考虑这个伪代码 这本质上是我想做的 但这样写是行不通的 一旦您使用 Fetch 收到 Laravel 422 响应 response不包含实际的 JSON 数据 你必须使用response gt response jso
  • 在 Laravel 中动态设置数据库连接和语言

    我有 3 个域指向同一个Laravel应用 我想要的是每个人都连接到自己的数据库并根据 TLD 加载自己的语言文件 我可以在哪个文件中设置这些设置 我可以直接在配置文件中执行此操作 或者可以在加载配置之前执行某些事件 我拥有的是一个简短的函
  • 如何解决 Laravel 8 UI 分页问题?

    我在尝试最近发布的 laravel 8 时遇到了问题 我试图找出变化是什么以及它是如何工作的 当我这样做时 我遇到了分页 laravel 8 UI 变得混乱的问题 不知何故它发生了 有人可以帮助我吗 或者经历过同样的事情 像这样我在 lar
  • 如何在 Carbon Laravel 中添加日期和另一个日期?

    在我的 laravel 项目中 我想将日期时间增加到前一个日期时间 这是我的代码 expire order 0 gt expire date new Carbon now gt addMonths 6 这两行的结果是 2018 01 28

随机推荐