1
0
Fork 0
mirror of https://github.com/archtechx/jobpipeline.git synced 2025-12-12 05:24:03 +00:00
Turn any series of jobs into Laravel listeners. https://packagist.org/packages/stancl/jobpipeline
Find a file
Ercasor 6b5aaa16a5
Fix PHP 8.4 deprecation warning (#19)
WARN PHP Deprecated: Stancl\JobPipeline\JobPipeline::__construct(): Implicitly marking parameter $send as nullable is deprecated, the explicit nullable type must be used instead in vendor/stancl/jobpipeline/src/JobPipeline.php
2024-12-16 16:45:18 +01:00
.github/workflows Laravel 11 support 2024-01-27 23:01:45 +01:00
src Fix PHP 8.4 deprecation warning (#19) 2024-12-16 16:45:18 +01:00
tests fix: handle errors in closures [1.x] (#16) 2024-11-09 20:58:45 +01:00
.gitattributes Create .gitattributes 2020-05-16 05:54:46 +02:00
.gitignore wip 2022-02-01 21:50:56 +05:00
.php-cs-fixer.php wip 2022-02-01 21:50:56 +05:00
check wip 2022-02-01 21:50:56 +05:00
composer.json Laravel 11 support 2024-01-27 23:01:45 +01:00
LICENSE Create LICENSE 2020-05-15 18:28:16 +02:00
phpunit.xml L10 compatibility (#12) 2023-02-16 11:43:17 +01:00
README.md Mention returning false 2020-11-12 19:46:35 +01:00

Job Pipeline

Job Pipeline

The JobPipeline is a simple, yet extremely powerful class that lets you convert any (series of) jobs into event listeners.

You may use a job pipeline like any other listener, so you can register it in the EventServiceProvider using the $listen array, or in any other place using Event::listen() — up to you.

Creating job pipelines

These code snippets will use examples from my multi-tenancy package.

To create a job pipeline, start by specifying the jobs you want to use:

<?php

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

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

Then, specify what variable you want to pass to the jobs. This will usually come from the event.

<?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;
})

Next, decide if you want to queue the pipeline. By default, pipelines are synchronous (= not queued) by default.

🔥 If you do want pipelines to be queued by default, you can do that by setting a static property: \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)

Finally, convert the pipeline to a listener and bind it to an event:

<?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());

Note that you can use job pipelines even for converting single jobs to event listeners. That's useful if you have some logic in job classes and don't want to create listener classes just to be able to run these jobs as a result of an event being fired.

Tip: Returning false from a job cancels the execution of all following jobs in the pipeline. This can be useful to cancel a job pipeline that creates, migrates, and seeds databases if the create database job exists (e.g. because it detects that a database already exists). So it can be good to separate jobs into multiple pipelines, so that each logical category of jobs can be stopped individually.