Dans une application web, l’envoi de mails, le redimensionnement d’images ou les appels d’API externes peuvent prendre plusieurs secondes.
Traiter cela de manière synchrone dans une requête HTTP fait attendre l’utilisateur inutilement.Les queues Laravel exécutent ces tâches en arrière-plan : la requête retourne immédiatement une réponse, et un worker traite le job à part.
Backends supportés : base de données, Redis, Amazon SQS…
En dev, le driver sync exécute les jobs immédiatement, sans queue.
<?phpnamespace App\Jobs;use App\Models\User;use App\Mail\WelcomeMail;use Illuminate\Contracts\Queue\ShouldQueue;use Illuminate\Foundation\Queue\Queueable;use Illuminate\Support\Facades\Mail;class SendWelcomeEmail implements ShouldQueue{ use Queueable; /** * Instance du job. */ public function __construct( public User $user, ) {} /** * Exécution du job. */ public function handle(): void { Mail::to($this->user->email)->send(new WelcomeMail($this->user)); }}
ShouldQueue indique un traitement asynchrone. Le trait Queueable fournit les méthodes nécessaires.
Passer un modèle Eloquent au constructeur sérialise seulement son ID. Au moment de l’exécution, le modèle est récupéré à jour : payload allégé.
Pour renvoyer le job dans la queue sans l’exécuter, sous condition, utilisez le middleware Release.
use Illuminate\Queue\Middleware\Release;/** * Middlewares que le job traverse. */public function middleware(): array{ return [ // Si $condition == true, libère après 60 s Release::when($this->order->isPending(), releaseAfter: 60), ];}
Release::unless() libère si la condition est false.
use Throwable;public function failed(?Throwable $exception): void{ // Notifier un admin Slack, etc. // Notification::route('slack', config('app.slack_webhook')) // ->notify(new JobFailedNotification($this, $exception));}
<?phpnamespace App\Jobs;use App\Models\Order;use App\Mail\OrderConfirmed;use Illuminate\Contracts\Queue\ShouldQueue;use Illuminate\Foundation\Queue\Queueable;use Illuminate\Queue\Attributes\Tries;use Illuminate\Queue\Attributes\Timeout;use Illuminate\Support\Facades\Mail;#[Tries(3)]#[Timeout(30)]class SendOrderConfirmation implements ShouldQueue{ use Queueable; public function __construct( public Order $order, ) {} public function handle(): void { Mail::to($this->order->user->email) ->send(new OrderConfirmed($this->order)); }}
3
Dispatcher depuis un contrôleur
use App\Jobs\SendOrderConfirmation;public function store(Request $request): RedirectResponse{ $order = Order::create($request->validated()); SendOrderConfirmation::dispatch($order); return redirect()->route('orders.show', $order) ->with('success', 'Commande enregistrée.');}