Laravel 13.26 Nouveauté Publié le

Ne traiter que le dernier événement d'une rafale avec #[DebounceFor]

Un écouteur mis en file avec #[DebounceFor] attend la fin de la rafale et ne traite que le dernier événement, là où ShouldBeUnique gardait le premier.

Notions abordées : Files d'attenteÉvénements

Nouveau dans Laravel 13.26. Quand un produit est modifié plusieurs fois de suite, réindexer à chaque modification coûte cher. La parade habituelle, ShouldBeUnique, écarte les doublons… mais garde le premier événement : l'index reçoit une version déjà périmée. L'attribut #[DebounceFor] attend la fin de la rafale et ne traite que le dernier événement.

Avant

class MettreAJourLIndex implements ShouldQueue, ShouldBeUnique
{
    public int $uniqueFor = 30;

    public function uniqueId(ProduitModifie $event): string
    {
        return (string) $event->produitId;
    }
}

Depuis Laravel 13.26

#[DebounceFor(30)]
class MettreAJourLIndex implements ShouldQueue
{
    public function debounceId(ProduitModifie $event): string
    {
        return (string) $event->produitId;
    }
}

Chaque événement est mis en file avec 30 secondes de délai. Au moment de le traiter, Laravel écarte ceux qu'un événement plus récent, avec le même debounceId, a remplacés. L'option maxWait (#[DebounceFor(30, maxWait: 120)]) évite qu'un flot continu repousse le traitement indéfiniment.

À faire

Réécrivez MettreAJourLIndex avec #[DebounceFor]. Les tests envoient des rafales de modifications dans une vraie file d'attente, puis lancent un worker : chaque produit doit être indexé une fois, avec son dernier nom.

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