stancl/jobpipeline

将任何一系列任务转换为Laravel监听器。

v2.0.0-rc2 2024-01-27 22:02 UTC

README

Job Pipeline

JobPipeline是一个简单但功能强大的类,它允许你将任何(一系列)任务转换为事件监听器。

你可以像使用任何其他监听器一样使用任务管道,因此您可以使用$listen数组将其注册到EventServiceProvider,或者在任何其他位置使用Event::listen()——由您决定。

创建任务管道

以下代码片段将使用我的多租户包中的示例。

要创建任务管道,首先指定您想要使用的任务

<?php

use Stancl\JobPipeline\JobPipeline;
use Stancl\Tenancy\Jobs\{CreateDatabase, MigrateDatabase, SeedDatabase};

JobPipeline::make([
    CreateDatabase::class,
    MigrateDatabase::class,
    SeedDatabase::class,
])

然后,指定您想要传递给任务的变量。这通常来自事件。

<?php

use Stancl\JobPipeline\JobPipeline;
use Stancl\Tenancy\Jobs\{CreateDatabase, MigrateDatabase, SeedDatabase};
use Stancl\Tenancy\Events\TenantCreated;

JobPipeline::make([
    CreateDatabase::class,
    MigrateDatabase::class,
    SeedDatabase::class,
])->send(function (TenantCreated $event) {
    return $event->tenant;
})

接下来,决定您是否想要排队管道。默认情况下,管道是同步的(=未排队)。

🔥如果您确实想要默认排队管道,您可以通过设置静态属性来实现:\Stancl\JobPipeline\JobPipeline::$shouldBeQueuedByDefault = true;

<?php

use Stancl\Tenancy\Events\TenantCreated;
use Stancl\JobPipeline\JobPipeline;
use Stancl\Tenancy\Jobs\{CreateDatabase, MigrateDatabase, SeedDatabase};

JobPipeline::make([
    CreateDatabase::class,
    MigrateDatabase::class,
    SeedDatabase::class,
])->send(function (TenantCreated $event) {
    return $event->tenant;
})->shouldBeQueued(true)

如果您希望将任务推送到不同的队列,您可以传递一个字符串作为第二个参数

<?php

use Stancl\Tenancy\Events\TenantCreated;
use Stancl\JobPipeline\JobPipeline;
use Stancl\Tenancy\Jobs\{CreateDatabase, MigrateDatabase, SeedDatabase};

JobPipeline::make([
    CreateDatabase::class,
    MigrateDatabase::class,
    SeedDatabase::class,
])->send(function (TenantCreated $event) {
    return $event->tenant;
})->shouldBeQueued(true, 'another-queue');

这可以通过调用shouldBeQueued(queue: 'another-queue')来简化,因为第一个参数默认为true

最后,将管道转换为监听器并将其绑定到事件

<?php

use Stancl\Tenancy\Events\TenantCreated;
use Stancl\JobPipeline\JobPipeline;
use Stancl\Tenancy\Jobs\{CreateDatabase, MigrateDatabase, SeedDatabase};
use Illuminate\Support\Facades\Event;

Event::listen(TenantCreated::class, JobPipeline::make([
    CreateDatabase::class,
    MigrateDatabase::class,
    SeedDatabase::class,
])->send(function (TenantCreated $event) {
    return $event->tenant;
})->shouldBeQueued(true)->toListener());

请注意,您甚至可以使用任务管道将单个任务转换为事件监听器。如果您有一些在任务类中的逻辑,并且不想只为能够运行这些任务而创建监听器类,这将非常有用。

提示:从任务中返回false将取消管道中所有后续任务的执行。如果存在创建数据库的任务(例如,因为它检测到数据库已存在),这可以用于取消创建、迁移和数据库种子任务的任务管道。因此,将任务分开到多个管道中可能是个好主意,这样每个逻辑类别的任务都可以单独停止。