Ce qui se passe
Laravel 13.31.0 est sortie le 8 septembre 2026. Trois ajouts sortent du lot, tous orientés production plutôt que confort d'écriture.
Compter une file en un appel
Queue::totalSize(), proposé par Jack Bayliss (#61373),
répond à une question qu'on posait jusqu'ici en trois fois :
// avant
Queue::totalPendingSize() + Queue::totalDelayedSize() + Queue::totalReservedSize();
// après
Queue::totalSize();L'intérêt n'est pas l'économie de deux appels, c'est la justesse dans le temps : une addition maison ment le jour où une catégorie s'ajoute, et personne ne s'en aperçoit — un tableau de bord ne lève pas d'exception, il affiche un chiffre trop bas.
Savoir qu'un job a été interrompu
Le nouvel événement JobInterrupted (#61412,
Jack Bayliss) est émis quand un job portant le contrat Interruptible est
interrompu par le worker — typiquement lors d'un redéploiement, quand le worker
reçoit son signal d'arrêt.
use Illuminate\Queue\Events\JobInterrupted;
Event::listen(JobInterrupted::class, function (JobInterrupted $event) {
// libérer un verrou, refermer un fichier temporaire, journaliser
});Sans ce point d'accroche, une interruption ne laissait aucune trace : le job n'avait ni échoué ni réussi, il s'était simplement arrêté. C'est exactement le genre de silence qu'on découvre trois semaines plus tard, en cherchant pourquoi un verrou n'a jamais été relâché.
chaperone() sur les pivots
Caleb White (#61152) étend
chaperone() aux modèles pivots d'une relation BelongsToMany. Le problème qu'il
résout est précis : avec un pivot personnalisé, remonter au parent depuis le pivot
recharge les modèles depuis la base — alors que les deux étaient déjà disponibles
au moment de l'hydratation de la relation.
class Tag extends Model
{
public function posts(): BelongsToMany
{
return $this->belongsToMany(Post::class)
->using(PostTagPivot::class)
->chaperone(); // devine les noms de relations
// ou, si les noms sont non standards :
// ->chaperone(declaring: 'tag', related: 'post');
}
}Sans modèle pivot personnalisé, l'appel est un no-op — il ne coûte rien à écrire par défaut.
Ce qui compte aussi
- Quatre assertions « once » (#61415) :
Mail::assertSentOnce(),Mail::assertQueuedOnce(),Notification::assertSentToOnce()etNotification::assertSentOnDemandOnce()remplacent les variantes...Times(..., 1). - Le driver de file Redis devient compatible cluster (#61198) :
bulk()n'émet plus deMULTIlié à un nœud,allQueueNames()utiliseKEYS. Deux autres correctifs suivent sur phpredis en cluster (#61460, #61462). Vite::devServerUrl()(#61465) pour récupérer l'URL du serveur de développement.
Trois correctifs valent une relecture de vos propres usages :
lazy() et lazyById() ignoraient limit() et offset() (#61402), une fuite
mémoire est colmatée dans le client HTTP (#61438), et le middleware RateLimited
touchait des limites qui ne bloquaient pas le job (#61449).
À retenir
C'est une version mineure : rien ne casse, rien ne presse. Mais si vous supervisez
vos files, totalSize() remplace votre addition maison en cinq minutes — et si
vos jobs prennent des verrous, JobInterrupted mérite un écouteur avant le
prochain déploiement.
Source : Queue totalSize() and JobInterrupted Event in Laravel 13.31