Passer au contenu principal
En juin 2026, Laravel Cloud prend en charge les applications Symfony et Forge ajoute un cache Valkey managé ainsi que du stockage objet. Côté framework, on retrouve un lot conséquent de mises à jour : dispatch de jobs en masse, pooler Postgres, client/serveur MCP, etc. Source : Laravel June Product Updates

Laravel Framework

Bus::bulk() — dispatch de jobs en masse

Il est maintenant possible d’enregistrer un grand nombre de jobs avec un seul INSERT en base. L’INSERT en masse est effectué par connexion/queue, ce qui évite le coût d’un INSERT par job.
use Illuminate\Support\Facades\Bus;

Bus::bulk([
    new ProcessOrder($order1),
    new ProcessOrder($order2),
    new ProcessOrder($order3),
    // Efficace même pour des milliers d'éléments
]);

Prise en charge du pooler de transactions Postgres

Les poolers de connexions Postgres en mode transaction — PgBouncer, AWS RDS Proxy, Neon, etc. — sont désormais pris en charge au niveau du framework.
// config/database.php
'pgsql' => [
    'driver' => 'pgsql',
    'pooled' => true,  // Déclarer que la connexion passe par un pooler
    // ...
],
Pour les opérations de schéma ou les instructions DDL qui nécessitent une connexion directe, ajoutez ::direct au nom de la connexion pour contourner le pooler. DB::connection('pgsql::direct')->statement('CREATE INDEX ...')
Le framework gère automatiquement les emulated prepares, les binding booléens et tous les traitements nécessaires au pooler.

Prise en charge des outils client et serveur MCP

Les agents IA Laravel peuvent désormais utiliser les outils de serveurs MCP distants (via HTTP) et de classes de serveurs MCP locales. La conversion de schéma, l’encapsulation et l’appel sont entièrement automatisés.
class MyAgent extends Agent
{
    public function tools(): array
    {
        return [
            // Utiliser les outils d'un serveur MCP distant
            McpClient::tools('https://mcp.example.com'),
            // Utiliser les outils d'un serveur MCP local
            McpServer::tools(MyMcpServer::class),
        ];
    }
}

Commande artisan dev

artisan dev permet de démarrer tous les processus de développement avec une seule commande. Serveur, worker de queue, tailing des logs et Vite tournent simultanément, chacun avec une sortie en couleur distincte.
php artisan dev
// Enregistrer des commandes supplémentaires depuis un service provider
use Illuminate\Foundation\Console\DevCommands;

DevCommands::artisan('reverb:start', 'reverb')->orange();
DevCommands::register('stripe listen --forward-to ' . config('app.url'))->green();
Détecte automatiquement le gestionnaire de paquets Node.js (npm, yarn, pnpm, bun). C’est la convention officielle Artisan qui remplace l’ancien script composer dev.

Prise en charge des métadonnées de routes

La méthode ->metadata() permet d’associer des métadonnées arbitraires à une route. Elle est totalement compatible avec le cache de routes, et les métadonnées définies sur un groupe sont fusionnées avec les routes enfants.
Route::metadata(['head' => ['robots' => ['noindex'], 'author' => 'Taylor']])
    ->group(function () {
        Route::get('/users', [UserController::class, 'index'])
            ->metadata(['head' => ['title' => 'Users']]);
    });

// Accès depuis un contrôleur ou un middleware
$request->route()->getMetadata('head.title');          // 'Users'
$request->route()->getMetadata('head.author', 'Taylor'); // 'Taylor'

Gestionnaire d’exceptions sans réessai

Il est désormais possible d’empêcher les nouvelles tentatives pour les exceptions qu’il est inutile de relancer (entrée invalide, panne externe persistante, etc.).
// Définition directement sur la classe d'exception
class InvalidInputException extends RuntimeException
{
    public function retry(): bool
    {
        return false;
    }
}

// Configurable également dans bootstrap/app.php
->withExceptions(function (Exceptions $exceptions) {
    $exceptions->dontRetry(InvalidInputException::class);
})

Flag —without-migration-data pour schema:dump

schema:dump peut désormais produire un dump de structure pur, en omettant les lignes de la table de migrations.
php artisan schema:dump --without-migration-data

Correction du fuseau horaire de between()/unlessBetween()

between() et unlessBetween() fonctionnent désormais avec le bon fuseau horaire quel que soit l’ordre par rapport à timezone().
// Les deux se comportent désormais de la même manière
// (auparavant, écrire between avant provoquait l'utilisation d'UTC)
$schedule->command('foo')->timezone('Europe/Rome')->between('10:00', '12:00');
$schedule->command('foo')->between('10:00', '12:00')->timezone('Europe/Rome');

Autres modifications du framework

  • Support des traits pour Bus::bulk() : possibilité de définir des attributs de queue dans un trait
  • Index vectoriels MariaDB : prise en charge des index vectoriels sur MariaDB
  • Helper attachFromStorage() : ajouter une pièce jointe depuis le stockage à un MailMessage de notification
  • Cache::rememberWithState() : cache avec support d’un état
  • Driver de mode maintenance pour tests parallèles : le driver array permet à chaque processus d’avoir son propre état de maintenance
  • whenFilledEnum() : traitement conditionnel d’un champ à l’aide d’une Enum
  • Support anyOf pour JSON Schema : possibilité d’utiliser anyOf de JSON Schema dans la validation

Inertia

  • Client\Request::uri() : récupération de l’URI d’une requête client
  • Attribut target des ancres : le composant <Link> prend en charge target="_blank" et similaires
  • Option async des formulaires : le composant Form prend en charge l’envoi asynchrone
  • Info de page dans titleCallback : les données de page sont passées au callback de titre

Laravel Cloud et Laravel Forge

ProduitPrincipales mises à jour
Laravel CloudPrise en charge complète des applications Symfony (Symfony 7.4 LTS et 8.x, PHP 8.2 à 8.5), déploiement et paiements depuis Stripe Projects, notifications Slack/e-mail configurables par membre d’équipe
Laravel ForgeCache Valkey managé (création et gestion depuis le tableau de bord), stockage objet managé, refonte des e-mails de notification
Dernière modification le 13 juillet 2026