Laravel 13.36 Nouveauté Publié le

Ne pas envoyer le mail d'une commande annulée

Un mailable en file respecte maintenant #[DeleteWhenMissingModels] : si sa commande a disparu entre-temps, la tâche est retirée au lieu d'échouer.

Notions abordées : MailFiles d'attente

Nouveau dans Laravel 13.36. Un mailable mis en file avec SerializesModels ne garde que l'identifiant de ses modèles ; le worker les relit avant d'envoyer. Si un modèle a été supprimé entre-temps, il lève une ModelNotFoundException, et la tâche échoue.

Pour une tâche (ShouldQueue), l'attribut #[DeleteWhenMissingModels] règle ce cas depuis longtemps : la tâche est retirée de la file, sans échec. Les mailables en file l'ignoraient.

Depuis Laravel 13.36

Les mailables en file lisent #[DeleteWhenMissingModels], et aussi #[FailOnTimeout] (un mail qui dépasse son délai est marqué en échec au lieu d'être retenté, ce qui pouvait l'envoyer deux fois) :

use Illuminate\Queue\Attributes\DeleteWhenMissingModels;

#[DeleteWhenMissingModels]
class OrderShipped extends Mailable implements ShouldQueue
{
    use Queueable, SerializesModels;

    public function __construct(public Order $order) {}
}

À faire

Quand l'entrepôt expédie une commande, le mail « Votre commande est en route » part en file. Mais un client annule parfois juste avant que le worker passe : la commande est supprimée, et chaque fois, une tâche s'ajoute à failed_jobs, où l'équipe la retrouve le lendemain.

Faites en sorte que le mail d'une commande disparue soit simplement abandonné.

D'où vient la fonctionnalité : la pull request d'origine.