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 :
- les opérations destructrices (
dropColumn(), renommages) ; - une colonne non nulle ajoutée à une table qui contient déjà des lignes ;
- un
->change()comparé à la définition réelle de la colonne ; - une clé étrangère que le moteur n'indexe pas de lui-même ;
- un index redondant, par exemple
(status)quand(status, created_at)existe ; - les noms de colonnes sensibles, comme un numéro de carte.
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.
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'existantSans 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.
php artisan difflock:diff --save # → database/difflock/schema.json
php artisan difflock:diff # compare à l'instantané versionné
php artisan difflock:diff --from=staging --to=productionEn 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.