Rendre Doctrine1 multi-connexions fonctionnel avec ses différents Behaviors

De e-glop
  • Vous utilisez Doctrine1.
  • Votre modèle de données utilise des Behaviors (créant des modèles temporaires, comme ItemVersionable ou bien EventTranslation).
  • Vous cherchez à utiliser un système multi-connexions / multi-bases de données

Vous n'y arrivez pas car vous faîtes l'expérience d'instabilités diverses, parfois donnant une impression d'aléatoire, voire même des plantages systématiques ? Alors ceci est fait pour vous !

Quelques références avant d'aller plus loin :

Voici donc LA solution à vos soucis :

Index: doctrine/Doctrine/Record/Generator.php
===================================================================
--- doctrine/Doctrine/Record/Generator.php	(révision 4690)
+++ doctrine/Doctrine/Record/Generator.php	(copie de travail)
@@ -48,7 +48,7 @@
         'cascadeDelete'  => true,
         'appLevelDelete' => false
     );
-
+    
     /**
      * Whether or not the generator has been initialized
      *
@@ -161,11 +161,13 @@
         }
 
         // check that class doesn't exist (otherwise we cannot create it)
-        if ($this->_options['generateFiles'] === false && class_exists($this->_options['className'])) {
+        $class_exists = class_exists($this->_options['className']);
+        if ($this->_options['generateFiles'] === false && $class_exists) {
             $this->_table = Doctrine_Core::getTable($this->_options['className']);
-            return false;
+            //return false;
         }
 
+        if ( !$class_exists )
         $this->buildTable();
 
         $fk = $this->buildForeignKeys($this->_options['table']);
@@ -461,10 +463,10 @@
             } else {
                 throw new Doctrine_Record_Exception('If you wish to generate files then you must specify the path to generate the files in.');
             }
-        } else {
+        } elseif ( !class_exists($definition['className']) ) {
             $def = $builder->buildDefinition($definition);
 
             eval($def);
         }
     }

Copiez/collez ceci dans un fichier texte. Il s'agit d'un fichier patch (mais je suppose que là, vous pensez que je vous prends pour des neuneux). Pour l'appliquer, placez vous à la racine de votre instance de Doctrine et faîtes :

$ cat $MONFICHIER | patch -p0

Essayez à nouveau votre solution web... et c'est gagné ! À bientôt pour de nouvelles aventures avec Cap'tain Crunch.