
laravel-news.com vient de compiler ce qui est déjà mergé et ce qui attend sagement son tour, et franchement, il y a de quoi faire sa checklist de refacto dès aujourd'hui. La grosse info, c'est que la version 14 demandera PHP 8.4 minimum, avec un support classique (bugfix jusqu'à Q3 2028, sécurité jusqu'à Q1 2029) — autant dire que si vous traînez encore un projet en PHP 8.1, le compte à rebours est lancé.
QUERY, authorize, context: quoi de neuf sous le capot?
Bon, entrons dans le vif. Première nouveauté sympa (et un peu WTF au premier abord): le support de la méthode HTTP QUERY, poussée par Vazha Aptsiauri dans la PR #60655. Pour ceux qui dormaient au fond, QUERY c'est une méthode safe qui porte un body — un hybride entre GET et POST, en gros. Laravel la reconnaît dans Route::any, et le middleware CSRF la traite comme une requête de lecture, au même titre que GET, HEAD et OPTIONS. Notez que Http::query est déjà dispo côté client HTTP depuis Laravel 13.19, donc la cohérence est là.
Ensuite, Will Rowe a ajouté une méthode authorize au contract Authorizable (#59708). Le principe? Ça marche comme $user->can, mais au lieu de renvoyer un booléen, ça throw une AuthorizationException quand le check échoue. Pour les architectures qui aiment le fail-fast (et on en est, non?), c'est clairement un game changer sous stéroïdes.
Et puis il y a le helper report et la méthode report du exception handler qui acceptent désormais un array de context optionnel (#60767 par Caleb White). Le contrat devient report(Throwable $e, array $context = []), donc si vous avez un handler custom qui override report, préparez-vous à mettre à jour la signature. Legacy oblige, hein.
Storage, queues et builders: les fixes qui vont (enfin) sauver des cheveux
Côté tests, Storage::fake('ondemand') va maintenant intercepter les appels à Storage::build (#61378) — pratique pour valider vos disques à la volée avec les mêmes assertions que vos disques named. Caleb White enchaîne avec la consolidation des whereKey et whereKeyNot, agrémentée des nouveaux orWhereKey et orWhereKeyNot (#61395), et une seconde PR (#61496) qui permet aux quatre méthodes d'accepter une sous-requête. Clairement, on n'avait pas attendu Laravel 14 pour souffrir avec ça.
Sur les queues, ça bouge aussi: depuis Laravel 13.25, vous pouvez pauser toutes les queues, mais les méthodes par queue sur la facade Queue exigeaient la connection en premier argument. La PR #61076 la déplace à la fin (avec fallback sur la connection par défaut) — même logique pour resume et isPaused. Bref, on respire un peu.
Deux bugs vicieux corrigés par Jack Bayliss: dans Laravel 13, lazy et chunk modifiaient le query builder en paginant, donc réutiliser le même builder après retournait des résultats faux (#61411 et #61428). Pareil pour Builder::findOr avec un tableau d'IDs: le callback n'était jamais appelé, ce qui est, comment dire, assez nul pour de la prod. Matthieu corrige ça dans #61577 pour matcher le comportement de findOrFail. Et tant qu'on y est, Cache::has(['a', 'b']) retournait toujours true, Cache::forget(['a', 'b']) ne supprimait rien — #61466 remet tout ça d'équerre. Quatre ans de docblocks qui mentaient, on respire.
Et pour nos migrations, alors?
Dernier point qui va parler à tous ceux qui font du soft delete: le trait Prunable ajoute withTrashed à la prune query quand le modèle utilise les soft deletes, mais MassPrunable ne le faisait pas. La PR #61425 harmonise les deux, donc model:prune va désormais force delete uniquement les posts non soft-deleted, proprement. Encore un de ces trucs qui paraît anodin mais qui, en audit, vous sauve une demi-journée.
Voilà, vous avez la cartographie. PHP 8.4 obligatoire, des bugs historiques qui disparaissent, et quelques ajouts qui vont devenir des réflexes. On en débriefe dans les commentaires: vous, vous commencez la migration 8.4 quand, vous attendez la 14, ou vous êtes déjà en 13.x et vous profitez des minor releases en attendant?