veilletech.fr
22 sept. Feed du jour
#04 LARAVEL Article

Difflock juge vos migrations sur la vraie base

Une migration se relit contre la base qu'elle va toucher, pas contre celle des tests.

Difflock 1.0 analyse les migrations Laravel sans les exécuter et les compare au schéma réel et au volume des tables, pour signaler ce qu'une base de test vide ne montre pas. Il enregistre aussi un instantané du schéma pour détecter les dérives, s'intègre à la CI par codes de sortie et expose un serveur MCP pour les agents.

3 min de lectureintermédiairevidéo 1:19
Partager
Sommaire6 sections
  1. Ce qui se passe
  2. Ce qu'il repère
  3. La dérive de schéma
  4. En CI, et pour les agents
  5. La limite à connaître
  6. À retenir

Ce qui se passe

Difflock, paquet Laravel publié par Rati Rukhadze (heyosseus/difflock, version 1.0.0), relit les migrations en attente sans les charger ni les exécuter, puis les confronte au schéma de la base qu'elles vont modifier et à la taille de ses tables. L'idée : une migration anodine en revue de code, et verte sur une base de test vide, peut être dangereuse sur une table remplie.

Ce qu'il repère

difflock:lint signale notamment :

Il rappelle aussi qu'un cascadeOnDelete() supprime les lignes enfants dans la base, donc sans événements de modèle, sans observers et sans suppression douce.

Terminal
php artisan difflock:lint                     # migrations en attente
php artisan difflock:lint -v                  # détail des constats
php artisan difflock:lint --rule=drop-column  # une seule règle
php artisan difflock:lint --all --accept      # accepter l'existant

Sans migration en attente, la commande audite tous les fichiers. La dernière ligne sert aux projets existants : elle écrit database/difflock/accepted.json, qui devient la référence, et seuls les nouveaux constats remontent ensuite.

La dérive de schéma

Plutôt que de reconstruire un schéma théorique à partir des migrations — piège dès qu'elles contiennent des conditions, des boucles ou du SQL brut — Difflock enregistre le schéma observé : tables, colonnes, index, valeurs par défaut, clés étrangères, sans données ni identifiants.

Terminal
php artisan difflock:diff --save                        # → database/difflock/schema.json
php artisan difflock:diff                               # compare à l'instantané versionné
php artisan difflock:diff --from=staging --to=production

En CI, et pour les agents

difflock:check --ci enchaîne dérive et lint, et sort avec 0 si tout passe, 1 en cas de dérive ou de constat au-delà du seuil configuré, 2 si le contrôle n'a pas pu tourner. Sans connexion à la base, il applique les règles qui ne lisent que le code et le signale.

difflock:mcp lance un serveur MCP en stdio, avec quatre outils : contexte d'une table, lint d'une migration (fichier ou texte), contrôle de dérive, documentation des règles. Un agent peut donc vérifier une migration avant de l'écrire. difflock:explain produit un résumé Markdown d'une migration sans appeler de modèle de langage.

La limite à connaître

Installer le paquet ne change pas php artisan migrate. Seul php artisan difflock:migrate s'arrête avant d'écrire quand un constat atteint le niveau bloquant ; --allow-risky force le passage, et --force garde son rôle habituel de confirmation en production. Pour inspecter la production, un rôle de base en lecture seule est le choix prudent — difflock:doctor indique si le rôle configuré peut écrire.

Source : Difflock: Lint Laravel Migrations and Diff Your Schema, Laravel News, 21 septembre 2026. Dépôt : Heyosseus/difflock.