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