ChainRunner — простое решение для запуска задач по порядку в Laravel

от автора

в
Время чтения: 1 мин.

Иногда в приложении нужно выполнить несколько задач строго в определённом порядке.
Например:

  • подготовить данные → обработать → сохранить;
  • скачать файл → разобрать → импортировать;
  • вызвать несколько 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 принимает массив джобов и выполняет каждый по очереди.
Ничего сложного:

  1. стартует ChainRunner;
  2. перебирает задачи в массиве;
  3. каждую выполняет сразу же, без ожидания очереди.

Такой подход удобен, когда порядок выполнения важнее всего остального.


Когда полезно

  • Когда есть несколько логических шагов, которые должны идти один за другим.
  • Когда не хочется помещать всю логику в один огромный Job.
  • Когда проще передать массив задач и быть уверенным, что они выполнятся по очереди.

Плюсы

  • Просто пользоваться — передал массив и готово.
  • Код чище — каждый шаг отдельным job-классом.
  • Полный контроль порядка — следующий шаг не начнётся раньше предыдущего.

Минусы

  • Нет retry на уровне отдельных задач — если что-то падает, падает весь ChainRunner.
  • Все шаги выполняются в одном процессе — если они тяжёлые, Job станет долгим.
  • Не подходит для параллельной работы — он именно про последовательность.

Вывод

ChainRunner — не какая-то новая фича Laravel, а просто аккуратное решение для случаев, когда важно выполнить несколько задач строго по порядку.

Простой класс, который помогает держать код структурированным и делает сложные процессы более понятными.


Комментарии

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Сколько будет 10 + 10?