miércoles, 19 de septiembre de 2012

Ingeniería inversa - Symfony2

Algunos proyectos web obligan a utilizar una base de datos existente y que no se puede modificar. En estos casos no es necesario crear las entidades con las herramientas explicadas en las secciones anteriores. Lo mejor es crear las entidades directamente a partir de la base de datos mediante las herramientas de ingeniería inversa que incluye Symfony2.

En primer lugar, configura la información de acceso a la base de datos mediante el archivo app/ config/parameters.ini (o, si lo prefieres, en el archivo app/config/config.yml). Después, eje- cuta el siguiente comando para transformar la estructura completa de tablas de la base de datos en las clases PHP de las entidades:

$ php app/console doctrine:mapping:import OfertaBundle annotation
Importing mapping information from "default" entity manager
> writing .../OfertaBundle/Entity/Ciudad.php
> writing .../OfertaBundle/Entity/Oferta.php
> writing .../OfertaBundle/Entity/Tienda.php
// ...

El primer argumento del comando es el nombre del bundle en el que se guardan todos los archivos generados automáticamente. El segundo argumento indica el formato utilizado para definir la in- formación de cada entidad. El valor annotation indicado anteriormente hace que la información se defina mediante anotaciones. Por esa razón el comando anterior genera una clase PHP por ca- da tabla de la base de datos e incluye todas las anotaciones necesarias para reflejar la estructura de tablas y el tipo de columnas.

Si el formato indicado es yml o xml, no se generan las clases PHP sino los archivos de configura- ción YAML o XML que se guardan en el directorio Resources/config/doctrine del bundle.

Para completar las entidades, añade los getters y setters con el siguiente comando:

$ php app/console doctrine:generate:entities OfertaBundle

Como todas las entidades de la aplicación se han creado en el bundle OfertaBundle, seguramente el último paso consistirá en colocar el archivo de cada entidad en su bundle correspondiente. No olvides modificar el valor del namespace en todas las clases que muevas de sitio.

Generar las entidades mediante ingeniería inversa es un proceso sencillo y que funciona muy bien, ya que Doctrine2 tiene en cuenta la información de las tablas, columnas, índices, claves primarias y externas. No obstante, el manual de Doctrine2 asegura que cuando el esquema de la base de datos es muy complejo, solamente se puede obtener entre el 70 y el 80% de la información. Con- ceptos como la herencia de entidades, las asociaciones inversas, los eventos y otra información avanzada tendrás que configurarla manualmente.

Y para el CRUD:

php app/console doctrine:generate:crud

Fuente: Desarrollo web ágil con Symfony2 - Javier Eguiluz

3 comentarios:

  1. Intente hacer eso que me dicen y sale el siguiente error que puede se
    [Doctrine\DBAL\DBALException]
    Unknown database type _bit requested, Doctrine\DBAL\Platforms\PostgreSqlPlatform may not support it.

    ResponderEliminar
  2. Si tenes a mano:

    Versión Symfony?
    Versión BD Postgress?

    Podemos ver un poco mas a fondo el tema

    Saludos

    ResponderEliminar
  3. muchas gracias , me ayudo mucho tu post

    ResponderEliminar