En un post anterior os hablé de Faker, una librería de PHP que permite generar datos de prueba de una forma sencilla y extensible. Como ya vimos, Faker permite generar diferentes tipos de datos y su integración con ORMs como Doctrine hace que sea una herramienta muy útil a la hora de desarrollar y probar una aplicación.
En este post vamos a ver una forma alternativa de generar estos mismos datos de prueba utilizando Alice, una librería que hace uso de Faker y nos permite definir y generar datos complejos mediante ficheros YAML (utilizando los mismos generadores que Faker) de una manera mucho más expresiva y fácil de mantener y editar.
Como viene siendo habitual, la forma más cómoda de instalar esta librería es a través de Composer:
<span>composer</span> require nelmio/alice
Nota: Podemos añadir el flag –dev para instalar esta librería sólo en entornos de desarrollo.
Para generar datos con Alice debemos definir primero un fichero YAML (extensión .yml) donde especificaremos qué tipo de entidades de Doctrine se deben crear y cómo se rellenarán sus propiedades. Una vez definido el fichero, utilizaremos la función load() de Alice, indicando la ruta al fichero de definición YAML y el gestor de objetos de Doctrine (que se utilizará para persistir las entidades en la base de datos). Como veremos en la siguiente sección, esta función se encargará de leer el fichero de definición, crear las entidades según las reglas de dicho fichero y persistirlas en la base de datos.
Veamos cómo hacerlo utilizando un ejemplo. Supongamos que tenemos las entidades de Doctrine Author (autor) y Book (libro, escrito por un único autor) que utilizamos en el ejemplo del post anterior. Podemos definir la generación de 10 registros de la entidad Author y 50 de la entidad Book (cada uno de los cuales estará asociado a un autor aleatorio) escribiendo el siguiente fichero YAML (en mi caso voy a llamarlo fixtures.yml):
<span>AppBundleEntityAuthor: author{1..10}: name: '<firstName()> <lastName()>' address: '<address()>' phone: '<phoneNumber()>' email: '<email()>' birthDate: '<dateTime()>' AppBundleEntityBook: book{1..50}: author: '@author*' title: '<sentence(6, true)>' description: '<text(500)>' isbn: '<isbn13()>' publisher: '<company()>' published: '<dateTime()>'</span>
Como se puede ver, cada sección corresponde a una entidad, en la que se debe incluir el espacio de nombres completo (en mi caso AppBundle). De cada entidad estamos indicando que se debe generar un rango de objetos con las líneas author{1..10}: (10 registros de la entidad Author) y book{1..50}: (50 registros de la entidad Book). De cada rango, a su vez, se especifica cómo rellenar las propiedades de cada uno de los registros generados.
En el caso de la entidad Author, con la línea name: ‘<firstName()> <lastName()>’ estamos diciendo que la propiedad name (nombre del autor) se rellenará con un nombre completo compuesto de un nombre (<firstName()>) y apellido (<lastName()>), separados por un espacio. Estos datos se generarán de forma aleatoria realizando llamadas a los proveedores de Faker del mismo nombre.
En Alice las llamadas a métodos deben encerrarse entre < y > (ejemplo <address()>). También es posible generar datos “estáticos” (que no cambian). Por ejemplo con name: ‘John Doe’ todos los autores generados tendrían como nombre “John Doe”.
En el caso de la entidad Book podemos ver además cómo se define la relación de un libro con su autor en la línea author: ‘@author*’. Utilizando el asterisco estamos indicando a Aliceque la propiedad author (relación con la tabla de autores) debe rellenarse con un autor aleatorio (de los generados anteriormente). Si, por ejemplo, pusiéramos en esta línea author: ‘@author1’ todos los libros quedarían relacionados con el primer autor generado.
También es posible pasar parámetros a los generadores de Faker, como en el caso del título del libro title: ‘<sentence(6, true)>’ en el que utilizamos el proveedor sentence indicando que la frase debe contener como máximo 6 palabras.
Una vez definido este fichero, debemos hacer que Alice lo cargue, genere los objetos y los persista en la base de datos utilizando Doctrine. Para ello basta con utilizar la siguiente instrucción:
<strong><span>$objectSet</span></strong> = NelmioAliceFixtures::load<span>('</span><span>/path/completo/fixtures.yml</span><span>',</span> <span><strong>$objectManager,</strong> [</span><span>'locale' </span>=><span> 'es_ES'</span><span>]);</span>
En el primer parámetro se debe indicar la ruta completa al fichero de definición YAML que hemos definido en la sección anterior. Como segundo parámetro se debe pasar el gestor de objetos de Doctrine (la forma de obtener este objeto varía según la estructura de la aplicación y/o el framework utilizado). Por último, en el tercer parámetro podemos pasar un arrayopcional con parámetros adicionales. En este ejemplo estoy indicando que la locale (código regional) es es_ES, de manera que Faker generará los datos en el idioma español (de España) de la misma forma que vimos en el post anterior.
Si ejecutamos el script con esta instrucción veremos que Alice nos genera 10 registros en la tabla author y 50 en la tabla book (cada uno de los cuales está relacionado con un registro de la table autor).
Como se puede ver, con Alice es realmente sencillo definir y generar datos de prueba aleatorios. En esencia, Alice nos permite hacer lo mismo que Faker, con la ventaja de que la definición de los datos se realiza de una manera más expresiva, concisa y fácil de mantener y editar usando ficheros YAML.
En este post se ha hecho una breve introducción a Alice. Sin embargo esta librería proporciona muchas más opciones para generar datos complejos y personalizados, por lo que os recomiendo que le echéis un vistazo a la documentación para poder sacar el máximo provecho de esta herramienta.