Ver índice de contenidos del libro

3.5. Los datos iniciales

Aunque ya hemos creado la base de datos, todas sus tablas están vacías. En cualquier aplicación web siempre existen tres tipos de datos:

  • Datos iniciales: son los datos que necesita la aplicación para funcionar. Jobeet por ejemplo necesita el nombre de algunas categorías y también es necesario al menos un usuario de tipo admin para poder acceder a la aplicación backend.
  • Datos de prueba: son los datos necesarios para probar la aplicación. Los buenos programadores crean pruebas unitarias para asegurar que la aplicación se comporta tal y como se describe en los escenarios. La mejor forma de probar la aplicación consiste en realizar pruebas unitarias automáticas. Cada vez que se ejecutan las pruebas unitarias es necesario disponer de datos de prueba en la base de datos.
  • Datos de usuarios: son los datos reales creados por los usuarios que utilizan la aplicación.

Cada vez que Symfony genera las tablas de la base de datos, se elimina toda la información existente. Para insertar de nuevo los datos iniciales podríamos utilizar un script de PHP o podríamos ejecutar directamente unas sentencias SQL con el comando mysql. No obstante, como se trata de una necesidad bastante habitual, Symfony ofrece una alternativa mucho mejor: crear archivos en formato YAML, guardarlos en el directorio data/fixtures/ y utilizar la tarea propel:data-load para cargarlos automáticamente en la base de datos:

En primer lugar, crea los siguientes archivos de datos en formato YAML:

# data/fixtures/010_categories.yml
JobeetCategory:
  design:        { name: Design }
  programming:   { name: Programming }
  manager:       { name: Manager }
  administrator: { name: Administrator }
# data/fixtures/020_jobs.yml
JobeetJob:
  job_sensio_labs:
    category_id:  programming
    type:         full-time
    company:      Sensio Labs
    logo:         sensio-labs.gif
    url:          http://www.sensiolabs.com/
    position:     Web Developer
    location:     Paris, France
    description:  |
      You have already developed websites with symfony and you want
      to work with Open-Source technologies. You have a minimum of 
      3 years experience in web development with PHP or Java and 
      you wish to participate to development of Web 2.0 sites using
      the best frameworks available.
    how_to_apply: |
      Send your resume to fabien.potencier [at] sensio.com
    is_public:    true
    is_activated: true
    token:        job_sensio_labs
    email:        [email protected]
    expires_at:   2010-10-10

  job_extreme_sensio:
    category_id:  design
    type:         part-time
    company:      Extreme Sensio
    logo:         extreme-sensio.gif
    url:          http://www.extreme-sensio.com/
    position:     Web Designer
    location:     Paris, France
    description:  |
      Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do
      eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut
      enim ad minim veniam, quis nostrud exercitation ullamco laboris
      nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor
      in reprehenderit in.
 
      Voluptate velit esse cillum dolore eu fugiat nulla pariatur.
      Excepteur sint occaecat cupidatat non proident, sunt in culpa
      qui officia deserunt mollit anim id est laborum.
    how_to_apply: |
      Send your resume to fabien.potencier [at] sensio.com
    is_public:    true
    is_activated: true
    token:        job_extreme_sensio
    email:        [email protected]
    expires_at:   2010-10-10

Nota El archivo de datos de las ofertas de trabajo hace referencia a dos imágenes. Puedes descargarlas desde el sitio web de Symfony y colocarlas en el directorio web/uploads/jobs/: http://www.symfony-project.org/get/jobeet/sensio-labs.gif y http://www.symfony-project.org/get/jobeet/extreme-sensio.gif

Un archivo de datos fixtures file) es un archivo escrito en formato YAML que define los objetos del modelo y los etiqueta con un nombre único (en el ejemplo anterior hemos creado dos ofertas de trabajo etiquetadas job_sensio_labs y job_extreme_sensio). Este nombre es imprescindible para relacionar objetos entre sí sin tener que definir claves primarias (que normalmente son valores que se auto-incrementan y por tanto, no se pueden establecer). En los archivos anteriores, la categoría de la oferta de trabajo job_sensio_labs es programming, que es el nombre único que le hemos dado a la categoría Programming.

Nota En los archivos YAML, cuando una cadena de texto contiene saltos de línea (como por ejemplo la columna description del archivo de datos de las ofertas de trabajo) puedes utilizar el símbolo | para indicar que la cadena de texto ocupa varias líneas.

Aunque los archivos de datos pueden contener objetos de uno o varios modelos diferentes, en los archivos de datos de Jobeet hemos decidido crear un archivo para cada modelo.

Nota Si te has fijado atentamente, habrás visto que los nombres de los archivos de datos incluyen un prefijo numérico. Aunque puedes utilizar los nombres que quieras, prefijar cada archivo con un número es una de las formas más sencillas de controlar el orden en el que se cargan los archivos de datos. Además, es una buena idea no utilizar números consecutivos por si más adelante tenemos que crear nuevos archivos de datos que se tienen que cargar entre medio de dos archivos ya existentes.

En los archivos de datos no es obligatorio establecer el valor de todas las columnas. Si no se indica el valor de una columna, Symfony le asigna el valor por defecto establecido en el esquema de la base de datos. Además, como Symfony utiliza Propel para cargar los datos, funcionan todas las características avanzadas (como establecer automáticamente el valor de las columnas created_at y updated_at) y todos los comportamientos que hayas definido en las clases del modelo.

Una vez creados los archivos de datos, cargarlos en la base de datos es tan sencillo como ejecutar la tarea propel:data-load:

$ php symfony propel:data-load

Nota La tarea propel:build-all-load es equivalente a ejecutar la tarea propel:build-all seguida de la tarea propel:data-load