Laravel – Populando banco com factory

O Laravel implementa com grande maestria um sistema de factories maravilhoso, porém, muitos desconhecem seu real potencial. Neste post, farei uma utilização simples, porém, será o suficiente para demostrar o potencial deste recurso.

As fectories do Laravel ficam no diretório database/factories, por padrão você irá encontrar neste diretório o arquivo de amostra ModelFactory.php que possui o seguinte código:

$factory->define(App\User::class, function (Faker\Generator $faker) {
    static $password;

    return [
        'name' => $faker->name,
        'email' => $faker->unique()->safeEmail,
        'password' => $password ?: $password = bcrypt('secret'),
        'remember_token' => str_random(10),
    ];
});

Já o arquivo database/seeds/DatabaseSeeder.php pode ser utilizado para chamar suas factories:

<?php

use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        // $this->call(UsersTableSeeder::class);
        factory(\App\User::class, 100)->create();
    }
}

Já a linha 15 está dividida em 4 partes:

  • factory: Facade factory;
  • \App\User::class: model utilizada para criar os objetos e persistir em banco;
  • 100: representa o total de registros que será criado, quem não conhece este recurso normalmente utiliza algum laço de repetição de forma desnecessária;
  • create(): método responsável por criar e persistir os registros em banco.

https://laravel.com/docs/5.3/database-testing#using-factories

Fakers em português

Para uma maior comodidade vamos inserir a variável abaixo ao arquivo .env:

FAKER_LANGUAGE=pt_BR

Lembre-se que o .env não é uma arquivo que por padrão é versionado, ou seja, é recomendado adicionar está mesma variável ao arquivo .env-example caso esteja trabalhando com versionamento.

Agora no arquivo \App\Providers\AppServiceProvider, dentro do método register você deve adicionar estas linhas:

if ($this->app->environment() !== 'production') {
    $this->app->singleton(\Faker\Generator::class, function () {
        return \Faker\Factory::create(env('FAKER_LANGUAGE'));
    });
}

A primeira linha possui uma condição que, somente registrará o serviço caso o ambiente não seja de produção.

Procedimento testado no Laravel 5.3