<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="https://ktherage.github.io/fr/xsl/atom.xsl" media="all"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
  <id>https://ktherage.github.io/fr/tags/migrations/</id>
  <title>Kévin THÉRAGE | Expert Symfony Developer - Migrations</title>
  <subtitle><![CDATA[Kévin THÉRAGE – Expert Symfony Developer. Technical blog on Symfony, PHP, web development with tutorials, best practices and expert advice for developers.]]></subtitle>
  <link href="https://ktherage.github.io/fr/tags/migrations/atom.xml" rel="self" type="application/atom+xml" />
  <link href="https://ktherage.github.io/fr/tags/migrations/" rel="alternate" type="text/html" />
  <updated>2026-06-08T09:33:13+00:00</updated>
  <author>
    <name>Kévin THÉRAGE</name>
    <uri>https://ktherage.github.io/</uri>
  </author>
  <entry xml:lang="fr">
    <id>https://ktherage.github.io/fr/blog/symfony-and-doctrine-migrations-validation-in-ci/</id>
    <title>Symfony &amp; Doctrine Migrations : Validation en CI</title>
    <published>2024-09-05T00:00:00+00:00</published>
    <link href="https://ktherage.github.io/fr/blog/symfony-and-doctrine-migrations-validation-in-ci/" rel="alternate" type="text/html" />
    <content type="html">
      <![CDATA[<p>J'ai eu l'opportunité de travailler sur un projet avec une équipe relativement novice en matière de migrations Doctrine. Pour les aider à s'y habituer et écarter la possibilité d'avoir des pull (ou merge) requests avec des modifications d'entités Doctrine sans migration générée.</p>
<p>Voici comment j'ai procédé. J'espère que cela vous plaira !</p>
<h2 id="avertissement">Avertissement</h2>
<p>Nous sommes le 10 juillet 2025 et cet article est obsolète en raison du merge de la Pull Request <a href="https://github.com/doctrine/migrations/issues/1406" rel="noopener noreferrer">https://github.com/doctrine/migrations/issues/1406</a> ; désormais, l'exécution de <code translate="no">bin/console doctrine:migrations:up-to-date</code> prend en compte la configuration <code translate="no">schema_filter</code>.</p>
<h2 id="comment-fonctionnent-les-migrations-doctrine">Comment fonctionnent les migrations Doctrine</h2>
<p>Lors de la génération de la migration, Doctrine calcule un delta entre son mapping et le schéma actuel de la base de données. Avec ce delta en mémoire, il génère un <strong>fichier de migration</strong> avec deux méthodes principales :</p>
<ul>
<li><code translate="no">up</code> applique les commandes SQL pour combler l'écart entre le schéma actuel de la base de données et son mapping. Utilisé pour déployer les modifications du schéma de votre base de données.</li>
<li><code translate="no">down</code> permet d'annuler la migration avec les commandes SQL nécessaires pour « annuler » les modifications effectuées dans la méthode up. Utilisé pour revenir en arrière sur les modifications du schéma de votre base de données.</li>
</ul>
<h2 id="l-astuce-magique">L'astuce magique</h2>
<p>Il n'existe actuellement aucun moyen simple de vérifier si une migration n'a pas été générée. Si ce code était fusionné, le schéma de la base de données pourrait ne plus être synchronisé avec le mapping des entités, entraînant ainsi une erreur serveur.</p>
<p>Les mots-clés dans la description ci-dessus sont <strong>fichiers de migration</strong>. J'utilise le fait que l'exécution de la commande <code translate="no">bin/console doctrine:migration:diff</code> génère un nouveau fichier et échoue s'il n'y a aucun changement à appliquer.</p>
<p>Connaître la liste des fichiers existants avant l'exécution de cette commande, puis l'exécuter, permet de détecter qu'il y a des modifications qui n'ont pas été commitées dans un <strong>fichier de migration</strong> dans cette pull (ou merge) request.</p>
<h2 id="etapes-a-suivre">Étapes à suivre</h2>
<ol>
<li>Créez votre base de données</li>
<li>Exécutez vos migrations existantes</li>
<li>Puis exécutez l'étape de vérification des modifications manquantes (voir ci-dessous)</li>
</ol>
<h2 id="avantages">Avantages</h2>
<ol>
<li>Tester que vos migrations ne échouent pas</li>
<li>Assurer la cohérence du schéma de base de données avec le mapping de Doctrine</li>
</ol>
<h2 id="vous-voulez-l-extrait-de-code-n-est-ce-pas">Vous voulez l'extrait de code, n'est-ce pas ?</h2>
<p>Voici le code bash :</p>
<pre><code class="language-bash hljs bash" translate="no"><span class="hljs-meta">#!/bin/bash
</span>
<span class="hljs-built_in">set</span> -e
<span class="hljs-built_in">set</span> -o pipefail

<span class="hljs-comment"># run doctrine migration diff to check if there is a new migration file generated and check last exit code</span>
<span class="hljs-keyword">if</span> [[ -z $(bin/console doctrine:migrations:diff -n --quiet) ]]; <span class="hljs-keyword">then</span>
    <span class="hljs-built_in">echo</span> <span class="hljs-string">"Error ! bin/console doctrine:migration:diff found a new migration which must not be the case."</span>;
    <span class="hljs-comment"># cat last file (should be the newly generated one)</span>
    cat $(ls -Art migrations/*.php | tail -n 1);
    <span class="hljs-comment"># remove that file (just in case to comply with my paranoïac side)</span>
    rm -f $(ls -Art migrations/*.php | tail -n 1);
    <span class="hljs-built_in">exit</span> 1;
<span class="hljs-keyword">else</span>
    <span class="hljs-built_in">exit</span> 0;
<span class="hljs-keyword">fi</span>
</code></pre>
<p>Et voilà ! Vous pouvez désormais vous assurer que chaque pull (ou merge) request contient des migrations fonctionnelles, sans modification en attente laissée de côté !</p>
<h2 id="ok-mais-pourquoi-ne-pas-utiliser-bin-console-doctrine-schema-validate">Ok, mais pourquoi ne pas utiliser <code translate="no">bin/console doctrine:schema:validate</code> ?</h2>
<p>La raison est que le projet sur lequel nous travaillions utilisait la configuration <code translate="no">schema_filter</code> de Doctrine pour filtrer certaines tables dont nous ne voulions pas nous occuper (contrainte liée au projet).</p>
<p>Le problème avec <code translate="no">bin/console doctrine:schema:validate</code> est qu'il ne prenait pas en compte cette configuration, et signalait donc des modifications (tentant de supprimer toutes les tables normalement filtrées) sans rapport avec ce que nous voulions.</p>
<p>Un collègue m'a dit qu'il s'agit d'un problème connu qui pourrait être corrigé prochainement (<a href="https://github.com/doctrine/migrations/issues/1406" rel="noopener noreferrer">https://github.com/doctrine/migrations/issues/1406</a>).</p>
<p>Merci d'avoir lu cet article et n'hésitez pas à laisser vos commentaires si vous avez des questions !</p>]]>
    </content>
  </entry>
</feed>
