Este foro ya no está activo, así que no puedes publicar nuevas preguntas ni responder a las preguntas existentes.

Generar la información a partir de XML

17 de junio de 2015

La web que estoy haciendo, parte del contenido lo toma de ficheros XML en lugar de hacerlo de una base de datos.

Me gustaría que me alguien con más experiencia me dijera cómo lo haría: dónde ubicar los ficheros XML, cómo adaptar los controladores, funciones que usaría. Yo trabajando con PHP a pelo siempre he usado la clase SimpleXml.

Muchas gracias de antemano.


Respuestas

#1

A mí me ha tocado trabajar en un proyecto parecido, pero en vez de archivos XML, tenemos archivos PHP generados con var_export() (mejor no preguntes por los detalles de esta aberración).

En cualquier caso, la primera solución que te propongo es la más obvia: ¿no puedes cargar el contenido de los archivoz XML en una base de datos? Ya se que no es algo trivial porque los archivos XML cambiarán y entonces hay que sincronizar bien la base de datos, pero es lo más cómodo a la larga.

La otra solución, que es la que estoy usando en mi proyecto, es crearte a mano una especie de repositorio de base de datos. Desde el punto de vista del controlador y del resto de la aplicación, todo funcionaría igual que si fuese una base de datos normal.

Si en el XML tienes por ejemplo los datos de las facturas, te creas una clase InvoiceRepository y un servicio asociado app.invoice_repository. Después en esa clase te creas los métodos típicos de los repositorios de Doctrine: find(), findAll() y algún findByXXX() que necesites.

Y dentro del código de esos find() y findAll() es donde tendrás que usar el file_get_contents() y demás funciones para trabajar con archivos, además del SimpleXML para procesar los contenidos.

Con todo esto, el controlador te quedaría muy limpio y totalmente desacoplado del detalle de que tu información venga de un archivo XML en vez de una base de datos:

public funcion showAction($id)
{
  $invoice = $this->get('app.invoice_repository')->find($id);
  // ...
}
 
public funcion listAction()
{
  $invoices = $this->get('app.invoice_repository')->findAll();
  // ...
}

@javiereguiluz

17 junio 2015, 12:59
#2

Muchas gracias Javier. Ya me gustaría poder hacerlo directamente desde bbdd. El problema es que cada vez que se carga la página se harían más de 400 consultas no triviales que ralentizan bastante la carga de la misma, por eso opté a hacerlo mediante un xml.

Voy a hacerlo como dices, a ver si soy capaz, que por ahora aunque le veo muchos beneficios a Symfony, sigo teniendo muchas lagunas que me hacen ir excesivamente lento en el desarrollo, especialmente con los formularios.

Un saludo!

@antoniocarvajal

18 junio 2015, 11:40