Bienvenido a Symfonyzame

sábado, 12 de junio de 2010

Vistas con Symfony y Propel

Recientemente, el proyecto en el cual estoy trabajando actualmente, requería del uso de vistas en la base de datos. Esto se debía a que el proyecto presenta dos aplicaciones, un pública que es un a tienda online, y otra que es una herramienta de gestión cuyo acceso es restringido. Pues bien, ambas partes se nutren de la misma base de datos. La diferencia es que la parte de la tienda online (pública) trabaja en su mayoría con vistas de las tablas de la base de datos.

Hasta el momento no había trabajado con vistas en Symfony. Me puse manos a la obra para buscar información y como todo en esta vida, lo que se sale un poco de lo general está recluido a un rincón oscuro de toda la cantidad de información que encontramos de Symfony en la red. Al final, tras buscar en los foros de google groups y en algunos otros, encontré los datos necesarios. Tras esta editorial que me he permitido por ser sábado, vamos a ver como se trabaja con vistas con Symfony y Propel.

En primer lugar, nos dirigimos al schema.yml . Aquí tendremos que declarar las vistas como tablas que son, para que Symfony genere el modelo que nos permitirá trabajar con ellas. En este ejemplo trabajaremos con una tabla a la que llamaremos acceso y que se trata de una tabla de acceso básica.

config/schema.yml

acceso:

_attributes: { phpName: Acceso }

id: { type: INTEGER, primaryKey: true, autoIncrement: true, required: true }

usuario: { type: VARCHAR, size: '255', required: false }

clave: { type: VARCHAR, size: '255', required: false }

ultimoacceso: { type: DATE, required: false }

rol: { type: VARCHAR, size: '50', required: false }

Ahora, necesitamos generar la vista sobre esta tabla, pero necesitamos indicarle que esta tabla es una vista. Para ello, utilizamos los comandos “skipSql” y “readOnly”. El primero dice al generador que no genere código sql para esta tabla, lo cual evitará que en la base de datos aparezca nuestra vista como una tabla más al insertar el sql. El segundo le da la propiedad de solo lectura, lo cual evita que intentemos hacer inserciones. Estas dos características definen a la tabla como vista. Procedemos a generar la vista de la tabla acceso:

config/schema.yml

acceso_tienda:

_attributes: { phpName: AccesoTienda, skipSql: trae, readOnly: true }

id: { type: INTEGER, primaryKey: true, autoIncrement: true, required: true }

usuario: { type: VARCHAR, size: '255', required: false }

clave: { type: VARCHAR, size: '255', required: false }

ultimoacceso: { type: DATE, required: false }

rol: { type: VARCHAR, size: '50', required: false }

En este caso la vista contiene los mismo campos que la tabla, incluso los campos mantienen el mismo nombre, ni que decir que vosotros podéis cambiar los identificadores de los campos incluso omitir aquellos que no os hagan falta.

Seguimos, hasta ahora tenemos la definición de nuestra vista, procedemos a generar el modelo e insertar los cambios en la base de datos, es decir, hacemos un “build-all” en la Terminal.

Si todo va bien y no hemos cometido ningún error propio del archivo yml, veremos que se han generado los archivos form, class.php, map y demás en la carpeta lib/ de nuestro proyecto que nos permitirán trabajar con nuestra vista y no se han generado la tabla en la base de datos.

El siguiente paso es generar la vistas, para ello nos vamos a nuestra base de datos y generamos manualmente:

CREATE VIEW "acceso_tienda" AS

SELECT acceso.id, acceso.usuario, acceso.clave, acceso.ultimoacceso, acceso.rol FROM usuario, acceso WHERE acceso.rol = 'cliente';

Con esto generamos la vista en la base de datos. Observar que el nombre de la tabla tiene que estar en el mismo formato al declarar la vista que en la declaración del archivo schema.yml (este caso “acceso_tienda”), sino luego os dará problemas de que no encuentra la tabla.

Para finalizar, nos que da limpiar caché y probar nuestra vista para comprobar que accede a los datos perfectamente. A efectos prácticos, Symfony trabaja con la vista como con una tabla más, no necesitáis comandos especiales ni nada de eso, haceros a la idea de que es una tabla nueva, eso si, solo de lectura.

Bien este es el proceso para trabajar con vistas usando Propel. Queda decir, que la generación de las vistas de forma manual implica que cada vez que reconstruyamos el modelo de nuestra base de datos estas vistas se eliminarán, y tendremos en generarlas de nuevo. Si habéis preparado los típicos datos de prueba en el fichero data/mixtures, sabréis que al hacer un data-load, Symfony recorre todos los archivos yml que se encuentran en este fichero para ir insertando los datos en la base de datos y asi tener un punto de partida. Pues bien, no ocurre lo mismo con el sql en el fichero data/sql y, por tanto, no se van a generar automáticamente las vistas con cada reconstrucción de la base de datos. Este es un aspecto en el que actualmente estoy investigando para no tener que hacer la generación de las vistas cada vez que se hace el “insert-sql”, hasta ahora lo resuelvo con un archivo donde voy guardando el código de generación de vistas y luego hago un copy/paste del sql en la base de datos, método que recomiendo a falta de la solución automática. Si alguien conoce la solución a este problema, agradecería mucho que lo compartiera, compartir es vivir ( aunque una amiga dice que es tener menos! xD).

Espero que os halla servido este mini tutorial de vistas con Symfoy y Propel y si sabéis como mejorar alguno de los aspectos y métodos expuestos comentárnoslo.

No hay comentarios:

Publicar un comentario