Faker

En muchos tutoriales y cursos de Styde.net hemos usado el componente de PHP Faker, creado por Francois Zaninotto, con el cual podemos dejar atrás la tediosa tarea de introducir manualmente los datos de la aplicación cuando queremos probar nuestro código. Con Faker podemos generar distintos tipos de datos como: nombres, teléfonos, ciudades, direcciones de correo, entre otros; ayudándonos a reducir tiempo y el esfuerzo de inventar datos ficticios para los registros. Vamos a conocer con más detalle las características que nos ofrece este componente y cómo usarlo en un proyecto de Laravel.

Instalación

Faker viene integrado por defecto en Laravel desde la versión 5.1, facilitándonos aún más su uso en nuestros proyectos, por tanto no necesitamos instalarlo.

Faker también puede ser implementado en proyectos donde no estés utilizando Laravel, solo necesitas llamarlo como una dependencia con Composer.

Elementos

Esta librería está compuesta de los siguientes elementos principales:

Factory: el cual crea una nueva instancia de Faker\Generator para poder generar datos accediendo a las propiedades que queremos obtener. Para crear dicha instancia simplemente escribimos:

$faker = Faker\Factory::create();

Con el objeto $faker podemos obtener cualquier dato aleatorio por ejemplo:

<?php
echo $faker->firstname;

“Formateadores”: son los que realmente generan los datos ficticios. En realidad, son cada una de las propiedades del generador pero que están organizadas y clasificadas en paquetes llamados Providers que se pueden extender dependiendo de las necesidades.

Puedes ver cuáles son los providers disponibles y los atributos que contiene cada uno aquí: https://github.com/fzaninotto/Faker#formatters

Modificadores: son tres métodos especiales: unique(), optional() y valid() que deben llamarse antes de cualquier provider:

El método unique permite forzar a los providers a que devuelvan valores únicos. Por ejemplo:

$months = [];
for ($i=0; $i < 12; $i++) {
   $months[]= $faker->unique()->monthName;
}

$months será un arreglo que tendrá todos los nombres de los meses del año de forma aleatoria pero sin repetirse.

En caso que exceda la cantidad de resultados únicos devolverá una excepción.

Podemos usar el método optional si queremos que algunas veces no se use el provider sino que se retorne un valor estático (que por defecto es null).

$monthNames = [];
for ($i=0; $i < 12; $i++) {
    $monthNames[]= $faker->optional()->monthName;
}

$monthNames será nuevamente un arreglo con los nombres de los meses del año, sin embargo alrededor del 50% de sus valores serán null.

También puedes alterar la probabilidad de que se retorne null o incluso personalizar el valor por defecto:

$monthNames = [];
for ($i=0; $i < 12; $i++) {
    $monthNames[]= $faker->optional(0.8, 'no month')->monthName;
}

$monthNames será un arreglo con los nombre de los meses del año de forma aleatoria pero solo llamará el provider en un 80% de las veces y en caso contrario devolverá la cadena no month.

El método valid solo acepta valores del provider que cumplan con la función anónima dada. Por ejemplo,

$months = [];

$evenValidator = function($month) {
    return intval($month) % 2 === 0;
};

for ($i=0; $i < 12; $i++) {
    $months []= $faker->valid($evenValidator)->month;
}

Dada la función anónima que evalúa si el mes obtenido es par, el método valid solo dejará guardar en $months los meses que cumplan con la condición.

Localización

Los datos aleatorios generados por defecto están localizados en en_US pero podemos tener datos específicos para un idioma – país pasando como argumento el locale que necesitamos. Como por ejemplo:

$faker = Faker\Factory::create('es_VE'); 

echo $faker->state;
// Amazonas

echo $faker->nationalId
// V1111630

Para conocer las opciones disponibles mira las carpetas en https://github.com/fzaninotto/Faker/tree/master/src/Faker/Provider. Si tu locale no se encuentra entre los disponibles puedes enviar el aporte a través de un Pull request en GitHub.

Agregar una semilla al generador

Si quieres que los datos generados sean siempre los mismos, como en el caso de que estés creando datos para pruebas automatizadas o cuando creas registros de prueba para tu aplicación puedes usar el método seed pasándole un número semilla arbitrario que tomará Faker para generar siempre los mismos resultados. Por ejemplo:

$faker = Faker\Factory::create();
$faker->seed(1234);

$faker->randomLetter
//el primer llamado de randomLetter siempre devolverá "v"

$faker->randomLetter
//el segundo siempre devolverá "m"

Uso de Faker en Laravel

Laravel por defecto usa Faker en los Model Factories para generar fácilmente registros de los modelos de un proyecto. Para ello inyecta a la función anónima el generador con el cual podemos crear los datos ficticios. Por ejemplo, para el factory del modelo User por defecto es así:

$factory->define(App\User::class, function (Faker $faker) {
    return [
        'name' => $faker->name,
        'email' => $faker->unique()->safeEmail,
        'email_verified_at' => now(),
        'password' => '$2y$10$TKh8H1.PfQx37YgCzwiKb.KjNyWgaHb9cbcoQgdIVFlYg7B77UdFm', // secret
        'remember_token' => str_random(10),
    ];
});

Creando model factories de cada modelo de nuestro proyecto y configurando cada atributo usando Faker podemos generar registros en cuestión de segundos, con esto rellenamos nuestra base de datos con todos los datos que necesitamos.

Por ejemplo, supongamos que tienes un modelo Profession, el cual creamos junto con su migración ejecutando:

#
php artisan make:model Profession -mf

En la migración creada agregamos un campo para el título de la profesión:

<?php
$table->string('title', 100)->unique();

En el factory usamos sentence(2) para crear dos palabras que servirán como título de profesión aleatorio:

<?php
'title' => $faker->sentence(2)

Para el modelo User modificamos su migración, agregando los siguientes campos:

 $table->unsignedInteger('profession_id')->nullable();
 $table->foreign('profession_id')->references('id')->on('professions');
 $table->enum('gender', ['male', 'female']);
 $this->string('first_name');
 $this->string('last_name');
 $this->string('company_name')->nullable();
 $this->string('phone_number');
 $table->enum('role', ['admin', 'author', 'suscriptor']);

Luego, actualizaremos el factory del modelo User para crear valores de los nuevos campos de manera ficticia, usando Faker.

$factory->define(User::class, function (Faker $faker) {
    return [
        'profession_id' => Profession::inRandomOrder()->value('id') ?: factory(Profession::class),
        'gender' => $faker->randomElement(['male', 'female']),
        'first_name' => function (array $user) {
            return $faker->firstName($user['gender']);
        },
        'last_name' => $faker->lastName,
        'email' => $faker->unique()->safeEmail,
        'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password
        'company_name' => $faker->optional(0.6)->company,
        'email_verified_at' => now(),
        'remember_token' => str_random(10),
        'phone_number' => $faker->phoneNumber,
        'role' => $faker->randomElement(['admin', 'author', 'suscriptor']),
    ];
});

Analizando un poco el Factory:

  • Con randomElement devolvemos una de las opciones pasadas en el arreglo, como por ejemplo, en genre solo tendrá dos posibles valores male o female.
  • Con safeEmail obtenemos un email aleatorio pero usando dominios no existentes como example.com, etc.
  • Con optional(60)->company le indicamos que solo el 60% de las veces se asigne un nombre de compañía, en caso contrario, devuelva null
  • No olvides revisar todas las opciones disponibles en https://github.com/fzaninotto/Faker#formatters para escoger la que mejores se adapten a tu campo.

De esta manera, luego de ejecutar las migraciones y usando Tinker podemos crear muchos registros de un modelo, adaptados al contexto de la aplicación:

$user = factory(App\User::class)->create();
// Devuelve un registro de User con datos aleatorios

$users = factory(App\User::class, 50)->create();
// Devuelve una colección Eloquent de 50 usuarios aleatorios

Puedes repasar sobre model factories con la lección Generar registros usando Model Factories en Laravel

Esto es todo por ahora, en el próximo tutorial te enseñaremos cómo crear tus Providers personalizados con Faker.

Únete a nuestro listado de correo para estar al tanto de nuevo material:

Suscríbete a nuestro boletín

Te enviaremos publicaciones con consejos útiles y múltiples recursos para que sigas aprendiendo.

Material relacionado

Regístrate hoy en Styde y obtén acceso a todo nuestro contenido.