Symfony: Migrar de Propel a Doctrine

junio 19, 2010

Desde que empecé con Symfony siempre he preferido utilizar Propel como ORM de mis proyectos. Me sentía cómodo utilizándolo excepto en esas ocasiones en las que se complicaba demasiado la consulta y había que tirar de ‘criteriones’ (al final optaba por construir la sql a mano). Había leído sobre Doctrine pero nunca me había parado a probarlo y utilizarlo ya que, como digo, me sentía muy cómodo con Propel y ni siquiera me planteaba cambiar.

En la nueva empresa donde trabajo (BlackSlot) he empezado a utilizar Doctrine y, ante mi sorpresa, me ha encantado. Me he dado cuenta de que si sabes sql es muy fácil aprender Doctrine y con resultados muy buenos. Con Propel, aunque sepas sql, tienes que aprender a usarlo y pensar las conversiones desde sql a Propel. Es un lenguaje nuevo.

Ante este escenario y como tengo un proyecto recién empezado, me decidí a migrarlo de Propel a Doctrine.

Tengo que destacar que la migración es realmente costosa. Si no fuese por que acabo de empezar el proyecto y no está muy avanzado, hubiese tenido que seguir con Propel. Personalmente, lo que más cuesta es transformar todo el modelo a Doctrine (todo depende de cuanto lleves hecho). Si es un proyecto acabado y bastante elaborado, te puede llevar días. Al modelo hay que añadir el modificar el schema.yml con el formato apropiado para Doctrine.

Otro quebradero de cabeza son los plugins en Propel que has utilizado en tu proyecto. El más típico es el sfGuardPlugin para llevar las cuentas de usuario. Tendrás que instalar el plugin sfDoctrineGuardPlugin que es el equivalente para Doctrine.

Si aún después de haber leído esto, sigues queriendo migrar de Propel a Doctrine un proyecto empezado, estos son los pasos que tienes que seguir:

¡No te olvides de hacer un backup de todo primero!

1) Editamos el fichero config/ProjectConfiguration.class.php y añadimos esta línea con la que cargamos todos los plugins excepto el de Propel.

1
$this->enableAllPluginsExcept(array('sfPropelPlugin'));

2) Borrar directorio plugins/sfGuardPlugin si es que lo tenemos instalado.

3) Borramos el actual schema de base de datos config/databases.yml
y reconfiguramos el proyecto para utilizarlo con Doctrine

1
php symfony configure:database --name=doctrine --class=sfDoctrineDatabase "mysql:host=localhost;dbname=nombre_base_de_datos" usuario contraseña

4) Ejecutamos:

1
php symfony plugin:publish-assets

para crear un enlace a sfDoctrinePlugin en el directorio web.

5) Borramos unos ficheros propios de Propel

1
2
rm web/sfPropelPlugin
rm config/propel.ini

6) Como es un proyecto empezado, supongo que tienes una base de datos ya creada.

Creamos el directorio donde alojamos el schema.yml para Doctrine:

1
mkdir config/doctrine

Y con el siguiente comando, recreamos el schema a partir de la base de datos existente:

1
php symfony doctrine:build-schema

No te olvides revisarlo, sobre todo las relaciones entre tablas.

7) Borramos el modelo anterior

1
rm -rf lib/model/*

Y lo volvemos a generar a partir del nuevo archivo schema.yml

1
2
3
symfony doctrine:build-model
symfony doctrine:build-forms
symfony doctrine:build-filters

A partir de aquí viene el trabajo duro: reescribir el modelo que teníamos en Propel y adaptarlo a Doctrine en las clases adecuadas del modelo.

También deberás instalar el plugin sfDoctrineGuardPlugin si lo estimas necesario (http://www.symfony-project.org/plugins/sfDoctrineGuardPlugin)

Espero que le pueda servir a alguien.

Tags ;

1 comentario

Escribe un comentario

Los comentarios son moderados y se utiliza rel="nofollow" para los enlaces.