ساخت Job در Laravel — dispatch، queue و ShouldQueue
بعد از فهم مفهوم Queue، قدم عملی ساخت Job است. Job یک کلاس PHP با متد handle() است که worker اجرا میکند — تمیزتر از closure برای logic قابل تست و reuse.
ساخت Job
php artisan make:job SendOrderConfirmation
class SendOrderConfirmation implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
public function __construct(public Order $order) {}
public function handle(MailService $mailService): void
{
$mailService->sendOrderConfirmation($this->order);
}
}
Dispatch
SendOrderConfirmation::dispatch($order);
// queue مشخص
SendOrderConfirmation::dispatch($order)->onQueue('emails');
// تأخیر
SendOrderConfirmation::dispatch($order)->delay(now()->addMinutes(5));
بعد از transaction commit dispatch کنید — DB::afterCommit(fn () => ...).
تنظیمات Job
public int $tries = 3;
public int $timeout = 120;
public int $backoff = 30;
یا متد backoff() برای exponential.
SerializesModels
Model در constructor serialize میشود — worker دوباره از DB میخواند. اگر model حذف شده باشد ModelNotFoundException — handle کنید.
Chain — ترتیب
Bus::chain([
new ProcessPayment($order),
new SendOrderConfirmation($order),
new UpdateInventory($order),
])->dispatch();
Batch — موازی با گزارش
Bus::batch([
new ResizeImage($path1),
new ResizeImage($path2),
])->dispatch();
Failed و retry
راهنمای failed jobs. متد failed(Throwable $e) برای cleanup.
تست
Bus::fake();
// action
Bus::assertDispatched(SendOrderConfirmation::class);
اشتباهات
- logic سنگین sync در controller
- dispatch قبل از commit
- queue نام اشتباه بدون worker
- model بزرگ در job property
جمعبندی
Job + Service = الگوی تمیز. Redis: Horizon. معماری: اصول Laravel.