Réussir facilement ses migrations

ou comment modifier son schéma sans perdre ses données !

Pour ce premier article dédié à Symfony, voici une méthodologie simple pour réussir les migrations. En effet, il arrive parfois au cours d’un développement qu’il soit nécessaire d’apporter des modifications au schéma de la base de données défini dans le fichier schema.yml. Si le développement n’en est pas à un stade très avançé, on peut sans problème regénérer toute la base ainsi que les classes rattachées avec la même commande que celle permettant de le faire la première fois puis de recharger, par exemple,  des données de test définies dans le ficher fixtures.yml. En revanche, lorsque une application est déjà en production, cette méthode n’est plus possible et la seule solution pour s’en sortir est donc de réaliser une migration.

Voici donc la méthodologie à employer pour réaliser cette opération:

Après avoir modifié le fichier schema.yml, la première étape consiste à définir les modifications qui vont être effectuées grâce à la commande suivante :

./symfony doctrine:generate-migrations-diff

Symfony va alors créer une ou plusieurs classes de migration, selon l’importance des modifications, dans les fichiers du répertoire migration du dossier lib. Avant de passer à l’étape suivante, il est conseillé de contrôler le contenu de ces fichiers afin de s’assurer de la conformité des modifications qui seront effectuées par rapport à celles qui sont souhaitées. La structure de ces classes est relativement simple avec deux méthodes au nom très explicite pour revenir en arrière dans ses modifications.

Si la structure de ces classes correspond à ce qui est attendu, il est temps d’appliquer la nouvelle structure à la base via la commande :

./symfony doctrine:migrate

Si tout s’est bien déroulé, le schéma de la base est maintenant à jour et une nouvelle table a été ajoutée (migration_version) pour stocker le numéro de la version actuelle de migration.

Il reste finalement une dernière étape avant de reprendre le développement de l’application : la regénération des classes de modèles, formulaires et filtres ainsi que le fichier sql. Pour cela, il faut utiliser la commande suivante:

./symfony doctrine:build --all-classes --sql

En effet, les méthodes de ces classes sont encore basées sur l’ancienne structure de la base de données. L’appel à cette commande va regénérer toutes les classes de type BaseXXX.class.php sans modifier les classes qui en héritent, XXX.class.php. Toutes les méthodes qui ont été ajoutées dans ces classes sont donc sauvegardées contrairement à celles qui auraient été rajoutées dans les classes de base (Mais qui s’amuserait à écrire des méthodes dans ces classes ?). Il faudra éventuellement corriger le code notamment si celui-ci fait appel à des méthodes qui n’existent plus (car elles ont été supprimées dans le schéma de la base).

Voici donc la procédure à suivre pour modifier le schéma sans perdre les données existantes. Pour appliquer ensuite tous ces changements à une application déjà en production, il faudra simplement utiliser la commande doctrine:migrate après avoir ajouté l’ensemble des nouveaux fichiers regénérés puis de supprimer le cache existant avec :

./symfony cc