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, engenre
solo tendrá dos posibles valoresmale
ofemale
. - 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, devuelvanull
- 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:
Material relacionado
- Uso de seeders con faker para cargar decenas de registros
- Generar registros usando Model Factories en Laravel
Regístrate hoy en Styde y obtén acceso a todo nuestro contenido.