Класс Bus
Класс Bus является фасадом Laravel для работы с диспетчером
очереди. Он предоставляет методы для отправки задач в очередь,
создания цепочек заданий и пакетной обработки. Основное назначение
класса - унифицированный интерфейс для диспетчеризации заданий
через шину очереди. Первым параметром методы класса принимают
экземпляр задания или массив заданий, вторым - конфигурационные
параметры.
Синтаксис
<?php
Bus::dispatch($job);
Bus::dispatchSync($job);
Bus::chain($jobs);
Bus::batch($jobs);
?>
Пример
Давайте отправим задание в очередь с использованием фасада
Bus:
<?php
namespace App\Jobs;
use Illuminate\Contracts\Queue\ShouldQueue;
class SendWelcomeEmail implements ShouldQueue
{
protected $userId;
public function __construct($userId)
{
$this->userId = $userId;
}
public function handle()
{
// Send welcome email logic
return "Welcome email sent to user {$this->userId}";
}
}
?>
<?php
namespace App\Http\Controllers;
use App\Jobs\SendWelcomeEmail;
use Illuminate\Support\Facades\Bus;
class UserController extends Controller
{
public function store()
{
$userId = 1;
$job = new SendWelcomeEmail($userId);
Bus::dispatch($job);
return response()->json(['message' => 'Job dispatched']);
}
}
?>
Результат выполнения кода:
"Job dispatched"
Пример
Давайте создадим цепочку последовательных заданий с помощью
метода chain:
<?php
namespace App\Jobs;
use Illuminate\Contracts\Queue\ShouldQueue;
class ProcessOrder implements ShouldQueue
{
protected $orderId;
public function __construct($orderId)
{
$this->orderId = $orderId;
}
public function handle()
{
return "Order {$this->orderId} processed";
}
}
?>
<?php
namespace App\Jobs;
use Illuminate\Contracts\Queue\ShouldQueue;
class SendOrderConfirmation implements ShouldQueue
{
protected $orderId;
public function __construct($orderId)
{
$this->orderId = $orderId;
}
public function handle()
{
return "Order {$this->orderId} confirmation sent";
}
}
?>
<?php
namespace App\Http\Controllers;
use App\Jobs\ProcessOrder;
use App\Jobs\SendOrderConfirmation;
use Illuminate\Support\Facades\Bus;
class OrderController extends Controller
{
public function process()
{
$orderId = 123;
$chain = Bus::chain([
new ProcessOrder($orderId),
new SendOrderConfirmation($orderId)
])->dispatch();
return response()->json(['message' => 'Chain dispatched']);
}
}
?>
Результат выполнения кода:
"Chain dispatched"
Пример
Давайте создадим пакет заданий с помощью метода batch
и добавим обратные вызовы для отслеживания выполнения:
<?php
namespace App\Jobs;
use Illuminate\Contracts\Queue\ShouldQueue;
class ProcessReport implements ShouldQueue
{
protected $reportId;
public function __construct($reportId)
{
$this->reportId = $reportId;
}
public function handle()
{
// Process report logic
return "Report {$this->reportId} processed";
}
}
?>
<?php
namespace App\Http\Controllers;
use App\Jobs\ProcessReport;
use Illuminate\Support\Facades\Bus;
class ReportController extends Controller
{
public function generate()
{
$batch = Bus::batch([
new ProcessReport(1),
new ProcessReport(2),
new ProcessReport(3)
])->then(function ($batch) {
// All jobs completed successfully
return "All reports processed";
})->catch(function ($batch, $exception) {
// First job failure detected
return "Batch failed: " . $exception->getMessage();
})->finally(function ($batch) {
// Always executed after batch completion
return "Batch finished";
})->dispatch();
return response()->json(['message' => 'Batch dispatched']);
}
}
?>
Результат выполнения кода:
"Batch dispatched"
Пример
Давайте выполним задание синхронно с помощью метода
dispatchSync:
<?php
namespace App\Jobs;
use Illuminate\Contracts\Queue\ShouldQueue;
class UpdateCache implements ShouldQueue
{
protected $key;
protected $value;
public function __construct($key, $value)
{
$this->key = $key;
$this->value = $value;
}
public function handle()
{
// Update cache logic
return "Cache updated for key {$this->key}";
}
}
?>
<?php
namespace App\Http\Controllers;
use App\Jobs\UpdateCache;
use Illuminate\Support\Facades\Bus;
class CacheController extends Controller
{
public function update()
{
$job = new UpdateCache('user_data', 'new_value');
$res = Bus::dispatchSync($job);
return response()->json(['result' => $res]);
}
}
?>
Результат выполнения кода:
"Cache updated for key user_data"
Смотрите также
-
метод
dispatch,
который отправляет задание в очередь -
класс
PendingDispatch,
который предоставляет дополнительные методы для настройки задания -
класс
Batch,
который представляет пакет заданий -
метод
dispatchSync,
который выполняет задание синхронно