sábado, 14 de mayo de 2011

sfGuard no funciona al copiar o exportar el proyecto

Si al copiar o exportar el proyecto, este plugin no funciona, incluso si funciona bien el entorno de desarrollo; tal vez dando un error como:

500 | Internal Server Error | Doctrine_Record_UnknownPropertyException
Unknown method SfGuardUser::checkPassword

Es muy probable que se deba al haber generado el archivo schema.yml a partir de la base de datos existente DESPUÉS de haber instalado el sfGuard. Al hacer esto se duplican las clases cuando se usan los subcomandos de symfony doctrine:build-model, doctrine:build-form y doctrine:build-filter o doctrine:build --all. Los nuevos archivos creados tienen nombre con formato *SfGuard*.php, a diferencia de los que vienen con el plugin cuyo formato es *sfGuard*.php (con 's' minúscula).

La solución es:
  • Eliminar los nuevos archivos generados. Podemos usar este comando tan cool:

    $ find . -name *SfGuard*.php | xargs rm

    Por paranoia mejor revisar que no se hayan quedado archivos, en particular los BaseSfGuard*.
  • Eliminar del archivo schema.yml de la aplicación las definiciones SfGuard*.
  • Recrear el modelo y la base de datos (obviamente si no se tienen datos, ya que los eliminará) o reconstruir las clases y eliminar las tablas de sf_guard manualmente en la base de datos.
Se debe revisar el SQL de sfGuard, ya que es probable que se haya reescrito y dañado. A mí me sucedió, es algo muy extraño pero es cierto y me dio un mal rato. Para estar seguros, se puede crear un proyecto nuevo e instalar el sfGuard y tomar el SQL original o copiarlo del repositorio del plugin.