مقاله

ایجاد Job class، dispatch، delay، chain، batch و بهترین شیوه handle — با مثال ارسال ایمیل و پردازش سفارش.

ساخت Job در Laravel — dispatch، queue و ShouldQueue

ساخت 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.

اتوماسیون workflow