Метод middleware
Метод middleware класса Job используется для определения промежуточных слоёв, которые должны быть выполнены перед обработкой задачи. Этот метод должен возвращать массив объектов промежуточных слоёв. Промежуточные слои дают возможность выполнить дополнительную логику до или после обработки задачи, например, ограничить частоту выполнения, проверить наличие блокировок или выполнить подготовительные действия.
Синтаксис
<?php
class MyJob implements ShouldQueue
{
// ...
public function middleware(): array
{
return [
new SomeMiddleware(),
new AnotherMiddleware(),
];
}
}
?>
Метод не принимает параметров и должен возвращать массив экземпляров промежуточных слоёв.
Пример
Рассмотрим простой пример задачи, которая использует промежуточный слой для ограничения частоты выполнения:
<?php
namespace App\Jobs;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Queue\Middleware\RateLimited;
class ProcessPodcast implements ShouldQueue
{
protected $podcastId;
public function __construct($podcastId)
{
$this->podcastId = $podcastId;
}
public function handle(): void
{
// Логика обработки подкаста
echo "Processing podcast ID: " . $this->podcastId;
}
public function middleware(): array
{
return [
new RateLimited('podcast_processing'),
];
}
}
?>
Результат выполнения при отправке задачи:
"Processing podcast ID: 123"
Пример
Используем несколько промежуточных слоёв - ограничение частоты и предотвращение пересечения задач:
<?php
namespace App\Jobs;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Queue\Middleware\RateLimited;
use Illuminate\Queue\Middleware\WithoutOverlapping;
class SyncData implements ShouldQueue
{
protected $dataId;
public function __construct($dataId)
{
$this->dataId = $dataId;
}
public function handle(): void
{
// Логика синхронизации данных
echo "Syncing data ID: " . $this->dataId;
}
public function middleware(): array
{
return [
new WithoutOverlapping($this->dataId),
new RateLimited('data_sync'),
];
}
}
?>
Результат выполнения при отправке задачи:
"Syncing data ID: 456"
Пример
Создаём собственный промежуточный слой для логирования перед выполнением задачи:
<?php
namespace App\Jobs;
use Illuminate\Contracts\Queue\ShouldQueue;
use App\Jobs\Middleware\LogMiddleware;
class LoggingJob implements ShouldQueue
{
protected $userId;
public function __construct($userId)
{
$this->userId = $userId;
}
public function handle(): void
{
// Логика задачи
echo "Processing user ID: " . $this->userId;
}
public function middleware(): array
{
return [
new LogMiddleware($this->userId),
];
}
}
?>
<?php
namespace App\Jobs\Middleware;
use Closure;
use Illuminate\Contracts\Queue\Job;
class LogMiddleware
{
protected $userId;
public function __construct($userId)
{
$this->userId = $userId;
}
public function handle($job, $next): void
{
echo "Logging: User ID " . $this->userId . " job started";
$next($job);
echo "Logging: User ID " . $this->userId . " job finished";
}
}
?>
Результат выполнения при отправке задачи:
"Logging: User ID 789 job started"
"Processing user ID: 789"
"Logging: User ID 789 job finished"
Смотрите также
-
метод
handle,
который содержит основную логику выполнения задачи -
метод
failed,
который вызывается при ошибке выполнения задачи -
атрибут
tries,
который определяет количество попыток выполнения задачи -
класс
WithoutOverlapping,
который предотвращает одновременное выполнение одинаковых задач