Doctrine ORM 3 a supprimé le type de colonne array (qui utilisait la sérialisation PHP).
Il faut utiliser le type json à la place.
- User (
pnu_user.roles) - Group (
pnu_group.roles)
Les scripts suivants permettent de convertir les données existantes du format PHP sérialisé vers JSON :
php bin/migrate-user-roles-to-json.phpCe script :
- Lit tous les utilisateurs de la table
pnu_user - Convertit le champ
rolesdu formata:0:{}(PHP serialize) vers[](JSON) - Ignore les enregistrements déjà au format JSON (safe pour réexécution)
- Affiche un rapport détaillé de la migration
php bin/migrate-group-roles-to-json.phpCe script :
- Lit tous les groupes de la table
pnu_group - Convertit le champ
rolesdu format PHP serialize vers JSON - Ignore les enregistrements déjà au format JSON (safe pour réexécution)
- Affiche un rapport détaillé de la migration
IMPORTANT : Avant toute migration, faire une sauvegarde complète de la base de données :
mysqldump -u user -p database_name > backup_avant_migration_$(date +%Y%m%d_%H%M%S).sqlVérifier que la variable DATABASE_URL est correctement configurée dans .env ou .env.local :
php -r "require 'vendor/autoload.php'; (new Symfony\Component\Dotenv\Dotenv())->bootEnv('.env'); echo \$_ENV['DATABASE_URL'] . PHP_EOL;"Exécuter les deux scripts dans l'ordre :
# 1. Migration des groupes (car les utilisateurs dépendent des groupes)
php bin/migrate-group-roles-to-json.php
# 2. Migration des utilisateurs
php bin/migrate-user-roles-to-json.phpVérifier que les données ont été correctement converties :
-- Vérifier un échantillon de groupes
SELECT id, name, roles FROM pnu_group LIMIT 5;
-- Vérifier un échantillon d'utilisateurs
SELECT id, username, roles FROM pnu_user LIMIT 5;Le format devrait être JSON :
[]pour un tableau vide["ROLE_ADMIN","ROLE_USER"]pour un tableau avec des valeurs
Une fois la migration des données réussie, déployer le nouveau code avec les entités mises à jour.
php bin/console cache:clear --env=prodSi un problème survient après la migration :
-
Restaurer la sauvegarde de la base de données :
mysql -u user -p database_name < backup_avant_migration_YYYYMMDD_HHMMSS.sql -
Revenir au code précédent avec les types
array
- ✅ Idempotents : Peuvent être réexécutés sans danger
- ✅ Safe : Détectent automatiquement les données déjà converties
- ✅ Informatifs : Affichent un rapport détaillé avec statistiques
- ✅ Configurables : Utilisent
DATABASE_URLdepuis.env - ✅ Gestion d'erreurs : Continuent en cas d'erreur sur un enregistrement
- ✅ Exit codes : Retournent 0 en cas de succès, 1 en cas d'erreur
Avant : a:1:{i:0;s:16:"ROLE_SUPER_ADMIN";}
Après : ["ROLE_SUPER_ADMIN"]
Avant : a:0:{}
Après : []
Avant : a:2:{i:0;s:10:"ROLE_ADMIN";i:1;s:9:"ROLE_USER";}
Après : ["ROLE_ADMIN","ROLE_USER"]
Avant : a:0:{}
Après : []
- Login : Tester la connexion avec différents utilisateurs sur
/login - Permissions : Vérifier que les rôles sont bien appliqués
- Admin : Accéder à l'interface Sonata Admin sur
/admin/dashboard(redirection automatique vers/loginsi non connecté) - Groupes : Vérifier que les rôles des groupes sont bien hérités par les utilisateurs
- Un seul point de login :
/loginpour toute l'application (front et admin) - Les firewalls
adminetmainpartagent le même contexte (context: user) - Une fois connecté sur
/login, vous avez accès à l'admin si vous avez les rôles nécessaires - Les routes admin protégées redirigent automatiquement vers
/loginsi non authentifié
En cas de problème lors de la migration, consulter les logs des scripts qui affichent :
- Le nombre total d'enregistrements traités
- Le nombre d'enregistrements mis à jour
- Le nombre d'enregistrements déjà en JSON (ignorés)
- Le nombre d'erreurs avec détails