Метод chain
Метод chain класса Bus используется для построения цепочки заданий, которые выполняются последовательно. Каждое следующее задание в цепочке начинает выполняться только после успешного завершения предыдущего. Первым параметром метод принимает массив заданий, которые будут выполнены последовательно.
Синтаксис
<?php
use IlluminateSupportFacadesBus;
Bus::chain($jobs)->dispatch();
?>
Пример
Давайте создадим простую цепочку из трёх заданий, которые будут выполняться последовательно:
<?php
namespace AppJobs;
use IlluminateContractsQueueShouldQueue;
class FirstJob implements ShouldQueue
{
public function handle()
{
echo "First job executed\n";
}
}
?>
<?php
namespace AppJobs;
use IlluminateContractsQueueShouldQueue;
class SecondJob implements ShouldQueue
{
public function handle()
{
echo "Second job executed\n";
}
}
?>
<?php
namespace AppJobs;
use IlluminateContractsQueueShouldQueue;
class ThirdJob implements ShouldQueue
{
public function handle()
{
echo "Third job executed\n";
}
}
?>
<?php
namespace AppHttpControllers;
use IlluminateSupportFacadesBus;
use AppJobsFirstJob;
use AppJobsSecondJob;
use AppJobsThirdJob;
class JobController extends Controller
{
public function index()
{
Bus::chain([
new FirstJob(),
new SecondJob(),
new ThirdJob()
])->dispatch();
return response()->json(['message' => 'Chain dispatched']);
}
}
?>
Результат выполнения кода в логе очереди:
"First job executed"
"Second job executed"
"Third job executed"
Пример
Использование цепочки с передачей данных между заданиями через свойства класса:
<?php
namespace AppJobs;
use IlluminateContractsQueueShouldQueue;
class ProcessJob implements ShouldQueue
{
public $data;
public function __construct($data)
{
$this->data = $data;
}
public function handle()
{
$this->data = strtoupper($this->data);
echo "Processed: " . $this->data . "\n";
}
}
?>
<?php
namespace AppJobs;
use IlluminateContractsQueueShouldQueue;
class SaveJob implements ShouldQueue
{
public $data;
public function __construct($data)
{
$this->data = $data;
}
public function handle()
{
// Simulate saving to database
echo "Saved: " . $this->data . "\n";
}
}
?>
<?php
namespace AppHttpControllers;
use IlluminateSupportFacadesBus;
use AppJobsProcessJob;
use AppJobsSaveJob;
class JobController extends Controller
{
public function process()
{
$initialData = 'abcde';
Bus::chain([
new ProcessJob($initialData),
new SaveJob($initialData)
])->dispatch();
return response()->json(['message' => 'Chain processed']);
}
}
?>
Результат выполнения кода в логе очереди:
"Processed: ABCDE"
"Saved: ABCDE"
Пример
Цепочка с использованием метода catch для обработки ошибок:
<?php
namespace AppJobs;
use IlluminateContractsQueueShouldQueue;
use Exception;
class FailingJob implements ShouldQueue
{
public $id;
public function __construct($id)
{
$this->id = $id;
}
public function handle()
{
if ($this->id % 2 === 0) {
throw new Exception("Failed job with ID: " . $this->id);
}
echo "Job " . $this->id . " executed\n";
}
}
?>
<?php
namespace AppJobs;
use IlluminateContractsQueueShouldQueue;
class BackupJob implements ShouldQueue
{
public function handle()
{
echo "Backup job executed\n";
}
}
?>
<?php
namespace AppHttpControllers;
use IlluminateSupportFacadesBus;
use AppJobsFailingJob;
use AppJobsBackupJob;
use Exception;
class JobController extends Controller
{
public function handle()
{
Bus::chain([
new FailingJob(1),
new FailingJob(2),
new BackupJob()
])->catch(function (Exception $e) {
echo "Caught exception: " . $e->getMessage() . "\n";
})->dispatch();
return response()->json(['message' => 'Chain with catch dispatched']);
}
}
?>
Результат выполнения кода в логе очереди:
"Job 1 executed"
"Caught exception: Failed job with ID: 2"
Смотрите также
-
метод
batch,
который позволяет выполнять задания пакетами -
метод
dispatch,
который отправляет задание в очередь -
класс
PendingDispatch,
который возвращается при отправке задания -
класс
Bus,
который предоставляет методы для работы с очередями