Иногда в приложении нужно выполнить несколько задач строго в определённом порядке.
Например:
- подготовить данные → обработать → сохранить;
- скачать файл → разобрать → импортировать;
- вызвать несколько API в правильной последовательности.
Можно, конечно, собрать всё в один Job, но тогда код становится тяжёлым и плохо читается. Поэтому удобнее разбить процесс на несколько маленьких задач, но всё равно запускать их по очереди, а не параллельно.
Для такого случая я сделал небольшой класс — ChainRunner.
Как выглядит код
<?php
namespace App\Jobs;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Queue\Queueable;
class ChainRunner implements ShouldQueue
{
use Queueable;
public function __construct(public readonly array $jobs)
{
}
public function handle()
{
foreach ($this->jobs as $job) {
dispatch_sync($job);
}
}
}
Что он делает
ChainRunner принимает массив джобов и выполняет каждый по очереди.
Ничего сложного:
- стартует ChainRunner;
- перебирает задачи в массиве;
- каждую выполняет сразу же, без ожидания очереди.
Такой подход удобен, когда порядок выполнения важнее всего остального.
Когда полезно
- Когда есть несколько логических шагов, которые должны идти один за другим.
- Когда не хочется помещать всю логику в один огромный Job.
- Когда проще передать массив задач и быть уверенным, что они выполнятся по очереди.
Плюсы
- Просто пользоваться — передал массив и готово.
- Код чище — каждый шаг отдельным job-классом.
- Полный контроль порядка — следующий шаг не начнётся раньше предыдущего.
Минусы
- Нет retry на уровне отдельных задач — если что-то падает, падает весь ChainRunner.
- Все шаги выполняются в одном процессе — если они тяжёлые, Job станет долгим.
- Не подходит для параллельной работы — он именно про последовательность.
Вывод
ChainRunner — не какая-то новая фича Laravel, а просто аккуратное решение для случаев, когда важно выполнить несколько задач строго по порядку.
Простой класс, который помогает держать код структурированным и делает сложные процессы более понятными.


Добавить комментарий