Класс ShouldQueue
Класс ShouldQueue является маркерным интерфейсом, который
указывает системе очередей Laravel, что задача должна быть поставлена
в очередь для асинхронной обработки. При реализации этого интерфейса
в классе задачи, Laravel автоматически помещает её в очередь при вызове
метода dispatch. Это позволяет разгрузить основной поток выполнения
и выполнять ресурсоемкие операции (отправка писем, обработка изображений,
генерация отчетов) в фоновом режиме.
Класс не требует реализации дополнительных методов, достаточно просто
добавить его в объявление класса задачи. Система очередей сама
обработает сериализацию, передачу данных и выполнение метода
handle в воркере очереди.
Базовое использование
Рассмотрим простой пример создания задачи для отправки письма:
<?php
namespace App\Jobs;
use App\Models\User;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
class SendWelcomeEmail implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
public $user;
public function __construct(User $user)
{
$this->user = $user;
}
public function handle()
{
// Логика отправки письма
echo "Welcome email sent to: " . $this->user->email;
}
}
?>
Теперь можно диспатчить задачу в очередь из любого места приложения:
<?php
namespace App\Http\Controllers;
use App\Models\User;
use App\Jobs\SendWelcomeEmail;
class UserController extends Controller
{
public function store()
{
$user = User::create([
'name' => 'John Doe',
'email' => 'john@example.com'
]);
SendWelcomeEmail::dispatch($user);
return response()->json(['message' => 'User created']);
}
}
?>
Конфигурация очереди
Класс ShouldQueue можно комбинировать с различными атрибутами
для тонкой настройки поведения задачи в очереди:
<?php
namespace App\Jobs;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
class ProcessReport implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
public $data;
public $tries = 5;
public $timeout = 120;
public $backoff = 10;
public function __construct($data)
{
$this->data = $data;
}
public function handle()
{
// Тяжелая обработка данных
echo "Processing report: " . $this->data;
}
}
?>
Пример с отправкой уведомления
Давайте создадим задачу для отправки уведомления пользователю о новом комментарии:
<?php
namespace App\Jobs;
use App\Models\User;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
class SendNotification implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
public $user;
public $message;
public $connection = 'redis';
public $queue = 'high';
public function __construct(User $user, $message)
{
$this->user = $user;
$this->message = $message;
}
public function handle()
{
echo "Notification sent to " . $this->user->email . ": " . $this->message;
}
}
?>
Диспатч задачи с указанием очереди и соединения:
<?php
namespace App\Http\Controllers;
use App\Models\User;
use App\Jobs\SendNotification;
class CommentController extends Controller
{
public function store()
{
$user = User::find(1);
$message = 'New comment on your post';
SendNotification::dispatch($user, $message)
->onConnection('redis')
->onQueue('high');
return response()->json(['status' => 'Comment added']);
}
}
?>
Обработка ошибок
При использовании ShouldQueue можно определить метод
failed для обработки ошибок выполнения задачи:
<?php
namespace App\Jobs;
use App\Models\User;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Illuminate\Support\Facades\Log;
class SendWelcomeEmail implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
public $user;
public function __construct(User $user)
{
$this->user = $user;
}
public function handle()
{
// Логика отправки письма
echo "Welcome email sent to: " . $this->user->email;
}
public function failed($exception)
{
Log::error('Job failed', [
'user_id' => $this->user->id,
'error' => $exception->getMessage()
]);
}
}
?>