Passer au contenu principal

Introduction

Laravel 12 est sorti en février 2025. Ce guide explique la procédure de mise à niveau de Laravel 11.x vers 12.x.
Le temps estimé est d’environ 5 minutes. L’impact des changements cassants dépend de la taille de l’application et des fonctionnalités utilisées.

Mise à niveau automatisée avec Laravel Shift

Vous pouvez automatiser la mise à niveau avec Laravel Shift.

Changements par impact

Impact élevé

  • Mise à jour des dépendances
  • Mise à jour de l’installer Laravel

Impact moyen

  • Trait Eloquent HasUuids et UUIDv7

Impact faible

  • Carbon 3
  • Mapping d’index des résultats Concurrency
  • Résolution des dépendances de classe du conteneur
  • Exclusion des SVG dans la validation image
  • Chemin racine par défaut du disque local
  • Introspection multi-schémas
  • Merge de tableaux imbriqués dans une requête

Étapes de mise à niveau

Mise à jour des dépendances

Impact : élevé Mettez à jour les dépendances suivantes dans composer.json.
{
  "require": {
    "laravel/framework": "^12.0"
  },
  "require-dev": {
    "phpunit/phpunit": "^11.0",
    "pestphp/pest": "^3.0"
  }
}
Installez :
composer update

Mise à jour de l’installer Laravel

Impact : élevé Si vous créez de nouvelles applications avec le CLI installer, mettez-le à jour pour la compatibilité avec Laravel 12.x et les nouveaux starter kits. Installé via composer global require :
composer global update laravel/installer
Installé via php.new : relancez la commande d’installation adaptée à votre OS.
/bin/bash -c "$(curl -fsSL https://php.new/install/mac/8.4)"
Avec la version fournie par Laravel Herd, mettez Herd lui-même à jour.

Nouveaux starter kits

Laravel 12 introduit de nouveaux starter kits qui remplacent Breeze et Jetstream. laravel new propose interactivement le choix de la stack frontend. Starter kits disponibles :
  • React — Inertia 2, React 19, TypeScript, Tailwind 4, shadcn/ui
  • Vue — Inertia 2, Composition API, TypeScript, Tailwind 4, shadcn-vue
  • Svelte — Inertia 2, Svelte 5, TypeScript, Tailwind 4, shadcn-svelte
  • Livewire — Livewire, Tailwind 4, Flux UI
laravel new my-app
Le choix du starter kit est demandé. Ensuite :
cd my-app
npm install && npm run build
composer run dev
Aucune réinstallation de starter kit n’est nécessaire pour une application existante. Cela concerne les nouveaux projets.

Changements cassants

Eloquent

Trait HasUuids et UUIDv7

Impact : moyen Le trait HasUuids renvoie désormais des UUID v7 (ordonnés). Pour conserver l’ancien comportement (UUID v4 ordonnés), passez au trait HasVersion4Uuids.
use Illuminate\Database\Eloquent\Concerns\HasUuids; // [tl! remove]
use Illuminate\Database\Eloquent\Concerns\HasVersion4Uuids as HasUuids; // [tl! add]
Si vous utilisiez HasVersion7Uuids, remplacez-le par HasUuids (comportement identique).

Validation

Exclusion des SVG dans la validation image

Impact : faible La règle image n’autorise plus les SVG par défaut. Autorisez-les explicitement si nécessaire.
use Illuminate\Validation\Rules\File;

'photo' => 'required|image:allow_svg'

// ou
'photo' => ['required', File::image(allowSvg: true)],

Stockage

Chemin racine par défaut du disque local

Impact : faible Si le disque local n’est pas défini explicitement dans filesystems, le chemin racine par défaut passe de storage/app à storage/app/private. Pour conserver l’ancien comportement, déclarez explicitement le disque local :
// config/filesystems.php
'local' => [
    'driver' => 'local',
    'root' => storage_path('app'),
],

Base de données

Introspection multi-schémas

Impact : faible Schema::getTables(), Schema::getViews(), Schema::getTypes() retournent désormais les résultats de tous les schémas par défaut. Passez schema pour cibler un schéma.
// Tables de tous les schémas
$tables = Schema::getTables();

// Tables du schéma 'main' uniquement
$tables = Schema::getTables(schema: 'main');
Schema::getTableListing() renvoie désormais des noms qualifiés par schéma par défaut.
$tables = Schema::getTableListing();
// ['main.migrations', 'main.users', 'blog.posts']

$tables = Schema::getTableListing(schema: 'main', schemaQualified: false);
// ['migrations', 'users']

Signature des constructeurs de base de données

Impact : très faible Les constructeurs de Illuminate\Database\Schema\Blueprint et Illuminate\Database\Grammar requièrent désormais une instance Connection en premier argument.
// Laravel <= 11.x
$grammar = new MySqlGrammar;
$grammar->setConnection($connection);

// Laravel >= 12.x
$grammar = new MySqlGrammar($connection);
Par ailleurs, les API suivantes sont supprimées ou dépréciées.
APIÉtat
Blueprint::getPrefix()Déprécié
Connection::withTablePrefix()Supprimé
Grammar::getTablePrefix() / setTablePrefix()Dépréciés
Grammar::setConnection()Supprimé
Récupérez le préfixe directement depuis la connexion.
$prefix = $connection->getTablePrefix();

Concurrency

Mapping d’index des résultats

Impact : faible Si vous passez un tableau associatif à Concurrency::run(), les résultats sont désormais renvoyés indexés par les mêmes clés.
$result = Concurrency::run([
    'task-1' => fn () => 1 + 1,
    'task-2' => fn () => 2 + 2,
]);

// ['task-1' => 2, 'task-2' => 4]

Conteneur

Valeurs par défaut lors de la résolution de classes

Impact : faible Le conteneur DI respecte désormais les valeurs par défaut des propriétés de classe lors de la résolution d’une instance.
class Example
{
    public function __construct(public ?Carbon $date = null) {}
}

$example = resolve(Example::class);

// Laravel <= 11.x : retourne une instance Carbon
// Laravel >= 12.x : retourne null

Requêtes

Merge de tableaux imbriqués

Impact : faible $request->mergeIfMissing() prend désormais en charge la notation dot pour fusionner des tableaux imbriqués. Auparavant, la clé en notation dot était créée telle quelle au niveau supérieur.
$request->mergeIfMissing([
    'user.last_name' => 'Otwell',
]);

Routage

Priorité des routes

Impact : faible Quand plusieurs routes portent le même nom, le comportement avec ou sans cache est désormais unifié. Sans cache, la première route enregistrée l’emporte (comme avec cache).

Authentification

Signature de DatabaseTokenRepository

Impact : très faible Le constructeur de Illuminate\Auth\Passwords\DatabaseTokenRepository accepte désormais $expires en secondes plutôt qu’en minutes.

Carbon 3

Impact : faible Le support de Carbon 2.x est supprimé. Toute application Laravel 12 requiert Carbon 3.x.

Conclusion

La mise à niveau vers Laravel 12 est relativement fluide.
ChangementImpactÀ faire
Mise à jour de composer.jsonÉlevélaravel/framework ^12.0
Mise à jour de l’installerÉlevécomposer global update
HasUuids → UUIDv7MoyenBasculer vers HasVersion4Uuids si besoin
Validation image sans SVGFaibleallow_svg si SVG requis
Racine du disque localFaibleDéclarer explicitement dans la config
Carbon 3 requisFaibleVérifier la compatibilité API

Ressources

Dernière modification le 13 juillet 2026