Forçando o faker a falar nossa língua

Sem sombra de dúvidas Model Factory é uma das minhas funcionalidades favoritas do Laravel. Lançada a partir da versão do Laravel 5.1, veio para agilizar e facilitar em muito a vida dos desenvolvedores, quanto a necessidade de popular o banco de dados de um projeto com dados falsos.

Mas como nem tudo são flores, existe um inconveniente nesta funcionalidade. Por padrão os dados são gerados na língua inglesa (en_US). Mas o que alguns desenvolvedores não sabem, é que a biblioteca Faker, que é utilizada para criação dos dados falsos, possui suporte a vários idiomas incluindo o nosso (pt_BR).

Sabendo disto, fui atrás de soluções para este inconveniente e em minhas pesquisas encontrei diversas formas de resolver este pequeno problema, abaixo irei listar as formas possíveis que encontrei para solucioná-los.

UTILIZANDO O SERVICE PROVIDER (AppServiceProvider.php)

Supondo que você está trabalhando com uma versão do Laravel igual ou superior à 5.1, basta dizermos ao Laravel que o objeto Faker que será utilizado é o customizado por você. E nesta customização iremos informar que o Locale utilizado será o do nosso idioma (pt_BR).

 

 

<?php
  namespace App\Providers;
  use Illuminate\Support\ServiceProvider;
  use Faker\Generator as FakerGenerator;
  use Faker\Factory as FakerFactory;
  class AppServiceProvider extends ServiceProvider
{
           /**
            * Bootstrap any application services.
            *
            * @return void
           */
            public function boot()
           {
          //
          }
         /**
         * Register any application services.
         *
         * @return void
         */
          public function register()
          {
             $this->app->singleton(FakerGenerator::class, function () {
                 return FakerFactory::create(‘pt_BR’);
                });
         }
}

 

 

Da forma apresentada, toda e qualquer modelfactory criada, automaticamente irá utilizar o nosso objeto faker customizado.

CRIANDO SEU PRÓPRIO OBJETO FAKER (ModelFactory.php)

Outra forma que encontrei, foi a de criarmos uma instância do objeto fakerpara cada modelfactory criada, sempre customizando o objeto, setando olocale para o nosso idioma (pt_BR).

 

<?php
$faker = \Faker\Factory::create(pt_BR);
$factory->define(App\User::class, function () use ($faker) {
return [
name => $faker->name,
email => $faker->freeEmail,
street => $faker->streetAddress,
city => $faker->city,
state => $faker->stateAbbr,
postal => $faker->postcode,
birth_date => $faker->date($format = Y-m-d, $max = now),
password => bcrypt(str_random(10)),
remember_token => str_random(10),
];
});

 

Da forma que acabamos de ver, sempre teremos que instanciar e customizar um objeto faker antes de definirmos uma factory.

ADICIONANDO PROVIDERS AO OBJETO FAKER ORIGINAL (ModelFactory.php)

Outra forma que a biblioteca nos fornece para solucionar este incomodo, é adicionarmos providers no idioma desejado. No nosso caso usaremos os providers em português do Brasil (pt_BR).

 

 

<?php
$factory->define(App\User::class, function (Faker\Generator $faker) {
$faker->addProvider(new Faker\Provider\pt_BR\Address($faker));
$faker->addProvider(new Faker\Provider\pt_BR\Company($faker));
$faker->addProvider(new Faker\Provider\pt_BR\Internet($faker));
$faker->addProvider(new Faker\Provider\pt_BR\Payment($faker));
$faker->addProvider(new Faker\Provider\pt_BR\Person($faker));
$faker->addProvider(new Faker\Provider\pt_BR\PhoneNumber($faker));
return [
name => $faker->name,
email => $faker->freeEmail,
street => $faker->streetAddress,
city => $faker->city,
state => $faker->stateAbbr,
postal => $faker->postcode,
birth_date => $faker->date($format = Y-m-d, $max = now),
password => bcrypt(str_random(10)),
remember_token => str_random(10),
];
});

 

Esta forma nos oferece uma flexibilidade muito grande, pois poderemos customizar/definir o objeto faker apenas com os providers que necessitarmos.

FORMATTERS e PROVIDERS

Cada uma das propriedades do gerador (nameaddressstateloremphoneNumber entre outros) são chamados “formatters”. Um gerador de faker tem diversos formatters, empacotados em “providers”. Aqui está uma lista dos formatadores empacotados no locale padrão.

A classe Faker\Generator por si só não pode fazer muito. Ela precisa de objetos Faker\Provider para delegar a geração de dados. O Faker\Factory::create() na verdade cria um Faker\Generator c0m os providers padrão já embutidos. Logo abaixo podemos ver o que acontece nos bastidores:

<?php
$faker = new Faker\Generator();
$faker->addProvider(new Faker\Provider\en_US\Person($faker));
$faker->addProvider(new Faker\Provider\en_US\Address($faker));
$faker->addProvider(new Faker\Provider\en_US\PhoneNumber($faker));
$faker->addProvider(new Faker\Provider\en_US\Company($faker));
$faker->addProvider(new Faker\Provider\Lorem($faker));
$faker->addProvider(new Faker\Provider\Internet($faker));

 

POPULANDO O BANCO DE DADOS

Depois de solucionado o inconveniente da geração dos dados em nosso idioma ou qualquer outro que desejarmos, chegamos ao ponto crucial, como vamos agora popular o nosso banco de dados?

Simples, iremos utilizar outra funcionalidade do Laravel fantástica, que são os seeders. E para criar um seeder, vamos fazer uso do nosso grande amigo artisan, nosso companheiro de console que está sempre disponível para nos auxilar com rotinas do dia a dia, como criação de (modelsmigrationscontrollersseeders e etc).

Para criarmos nosso seeder, vamos precisar executar o seguinte comando:

$ php artisan make:seeder UsersTableSeeder

E dentro do arquivo que será criado no caminho (Database/Seeds/UsersTableSeeder.php) iremos chamar nossa factory já definida em ModelFactory, especificando que desejamos criar “50” usuários, conforme demostrado abaixo:

 

<?php
use Illuminate\Database\Seeder;
class UsersTableSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
factory(App\User::class, 50)->create();
}
}

Mas isto já é suficiente para conseguirmos popular o nosso banco de dados?

Precisamos ir em (Database/Seeds/DatabaseSeeder.php) e dizermos para o método run(), método este responsável para executar nossos seeders, quais seeders ele deverá executar. Por padrão o UsersTableSeeder, já vem incluso no DatabaseSeeder, porém encontra-se comentado. Então basta retirarmos o comentário da linha $this->call(UsersTableSeeder::class).

Ficaríamos com o seguinte DatabaseSeeder

 

<?php
use Illuminate\Database\Seeder;
class DatabaseSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
$this->call(UsersTableSeeder::class);
}
}

 

 

Agora sim podemos popular nosso banco de dados. Partindo de um princípio de que não tenhamos executado nenhuma migration, e nosso banco de dados já encontra-se devidamente configurado no arquivo .env. Basta agora executarmos o seguinte comando:

$ php artisan migrate –seed

Se tudo ocorreu bem, já teremos em nosso banco de dados os dados gerados pelo Faker neste momento.

O Artisan provê diversas funcionalidades para nós. Para termos uma visão mais ampla do que o artisan pode fazer por nós, basta digitarmos no nosso console o seguinte comando:

$ php artisan

Espero poder contribuir mais a cada dia, e gostaria de deixar claro que o exemplo utilizado neste artigo é apenas ilustrativo, não levei em consideração (boas práticas, normalização entre outras questões) que devem ser levadas em consideração no desenvolvimento de um projeto.

AGRADECIMENTOS

Como esta é minha primeira postagem no Medium, gostaria de agradecer a todos que distribuem conhecimento para a comunidade Laravel Brasil, seja ela de forma gratuita e/ou paga, pois são essas pessoas que ajudam a comunidade a crescer. Peço antecipadamente desculpas caso esqueça de mencionar o nome de algum de vocês, a memória é curta e falha as vezes. Mas quero agradecer aos colegas desenvolvedores: Diego HernandesVinicius ReisFábio VedovelliDaniel LemesLeandro Henrique entre tantos outros nomes.

FONTES DE PESQUISA

 

Fonte: https://medium.com/@vs0uz4/for%C3%A7ando-o-faker-a-falar-nossa-l%C3%ADngua-72d9ee73244c

 

 

 

 

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google

Você está comentando utilizando sua conta Google. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s