Laravel Legacy Bridge est un package de Chris Keller (chr15k) conçu pour les migrations progressives vers Laravel. Quand un projet est migré route par route, les utilisateurs peuvent être connectés sur l’ancienne application alors que les routes Laravel les traitent comme anonymes. Le package comble ce fossé : sur les requêtes non authentifiées, il lit le cookie de session legacy, récupère la ligne correspondante dans la base legacy, décode le payload et appelle loginUsingId() dans Laravel pour l’utilisateur correspondant. Une fois que Laravel a écrit sa propre session, le middleware cesse d’interroger le store legacy.

L’installation se fait via composer require chr15k/laravel-legacy-bridge puis php artisan legacy-bridge:install. La commande d’installation est interactive, propose des presets pour les frameworks legacy courants, demande les identifiants de la base de données et écrit les entrées .env nécessaires. Le package fournit aussi la commande php artisan legacy-bridge:verify, avec option --session-id, pour tester la configuration contre la vraie base legacy sans authentifier personne.

La configuration couvre les formats de payload et la résolution de l’utilisateur. Les formats supportés sont l’encodage natif des sessions PHP, JSON, le format base64(serialize()) de Laravel, et les payloads chiffrés via LEGACY_BRIDGE_APP_KEY. Le resolver peut être auto, une clé explicite en dot-notation, ou une classe personnalisée ; cette dernière permet également de mapper les anciens IDs utilisateurs vers les nouveaux si la table users a été réinitialisée. Le README recommande de commencer avec auto et de basculer sur key ou custom avant la production.

À la place d’un journal propre, le package émet des événements typés : LegacySessionBridged en cas de succès, LegacySessionBridgeFailed pour les échecs connus, et LegacySessionBridgeError pour les exceptions inattendues. Les échecs incluent une énumération BridgeFailureReason avec des cas comme MissingCookie, AmbiguousCookie, SessionExpired, PayloadDecodeFailed et UserNotResolved, ainsi qu’un DTO BridgeContext contenant le nom du cookie, l’ID de session, le payload, l’ID utilisateur et les métadonnées de la requête.

Les limitations actuelles : seules les sessions legacy en base de données sont supportées, pas les drivers file, Redis ou Memcached ; seules les requêtes web, pas les API stateless ; et seul le guard d’auth par défaut. Nécessite Laravel 13 et PHP 8.3+. Du côté sécurité, le package désérialise des payloads provenant de la table des sessions legacy, il faut donc considérer cette base comme une frontière de confiance et privilégier des accès en lecture seule. Le cookie legacy reste intentionnellement non chiffré ; les deux applications doivent donc utiliser HTTPS. La stratégie d’invalidation par défaut after_write supprime la session legacy dès que Laravel a écrit sa session ; ne jamais régler invalidation sur never en production. Un contexte optionnel permet de transporter des valeurs comme la locale ou l’ID de panier depuis le payload legacy.