vSouza Blog

Forçando o faker a falar nosso idioma.

Data de Publicação25 fevereiro, 2020Commentário...

idiomas

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 (enUS). 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 faker para cada modelfactorycriada, sempre customizando o objeto, setando olocalepara 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 (name, address, state, lorem, phoneNumber 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 (models, migrations, controllers, seeders 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?

not enough

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.

table_populated

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 às vezes. Mas quero agradecer aos colegas desenvolvedores: Diego Hernandes, Vinicius Reis, Fábio Vedovelli, Daniel Lemes, Leandro Henrique entre tantos outros nomes.

FONTES DE PESQUISA


Escrito por Vitor Souza, residente do Rio de Janeiro.
Filho, irmão, marido, pai, amigo e um eterno amante da tecnologia. Você pode me seguir no Twitter


© 2024, Construído com Gatsby