如何在 Lumen 6 中将链式作业分派到队列?

Der*_*ler 5 laravel lumen laravel-queue

在 Laravel 中,可以指定在主作业成功执行后应按顺序运行的排队作业列表。如果序列中的一项作业失败,则其余作业将不会运行。Laravel 文档显示,这是通过在可分派作业上使用 withChain 方法来完成的,如下例所示:

ProcessPodcast::withChain([
    new OptimizePodcast,
    new ReleasePodcast
])->dispatch();
Run Code Online (Sandbox Code Playgroud)

这在 Laravel 中对我来说效果很好,但是我使用的是 Lumen(Laravel 的轻量级子集)。
根据Lumen 关于队列的文档,“与框架的许多其他部分一样,Lumen 的排队作业的功能与 Laravel 的排队作业相同。因此,要了解有关 Lumen 中排队作业的更多信息,请查看完整的 Laravel 队列文档。”

Lumen 文档确实提到了与 Laravel 的一些细微差别,包括将作业分派到队列的方式的差异。它解释了 Lumen 中的作业可以使用调度函数或队列外观来调度:

dispatch(new ExampleJob);

Queue::push(new ExampleJob);
Run Code Online (Sandbox Code Playgroud)

以此为背景,Lumen有没有办法调度连锁作业呢?我已经在谷歌上搜索了几天,与我的问题最接近的匹配是这两个链接:

上面的 Stack Overflow 链接解释了 Laravel 语法不起作用的原因是 Lumen 缺少这个Illuminate\Foundation\Bus\Dispatchable特性。

更复杂的事情是,我需要向每个作业传递一组不同的参数 -即使在完整的 Laravel 框架中,这显然也具有挑战性

以下是我目前在 Lumen 应用程序中提交作业的方式(无链接):

Queue::push(new CreateUser($username,$password));
Queue::push(new SetForwarding($username,$forwardTo));
Queue::push(new EnableIncomingEmail($username));
Queue::push(new EnableOutgoingEmail($username));
Queue::push(new EnableImap($username));
Run Code Online (Sandbox Code Playgroud)

我想要链接这些的主要原因是为了确保在修改该用户的任何后续作业之前成功创建用户记录。

那么,考虑到所有这些……怎么样?Lumen 是否可以连锁工作?如果是这样,我会使用什么语法?

Olu*_*ule 3

illuminate/bus/QueueableApp\Jobs\Job类中使用的 Trait提供了一个链方法,应使用Job 实例数组调用该方法来创建作业链。

您可以通过编写以下命令来运行一系列作业:

$this->dispatch(
    (new CreateUser($username,$password))
    ->chain([
        new SetForwarding($username,$forwardTo),
        new EnableIncomingEmail($username),
        new EnableOutgoingEmail($username),
        new EnableImap($username)
    ])
);
Run Code Online (Sandbox Code Playgroud)