DEV Community

Cover image for Como funcionam as factories e seeders com Laravel
Elemar Leonel
Elemar Leonel

Posted on

Como funcionam as factories e seeders com Laravel

Introdução

Você já perdeu seu precioso tempo criando dados de teste manualmente? Pois é, até eu já passei por isso. Mas deixa eu te contar um negócio: as factories juntamente com as seeders podem acelerar o seu desenvolvimento trazendo uma série de vantagens que você nem imagina.

Passo a passo

As factories são as fábricas de dados. Com elas, você gera instâncias de módulos cheia de informações sem ter que ficar preenchendo tudo manualmente. É como se fosse um molde de como os dados serão registrados no nosso banco de dados.

No Laravel, você consegue criar uma factory utilizando o Artisan:

php artisan make:factory UserFactory --model=User
Enter fullscreen mode Exit fullscreen mode

Agora, precisamos definir os dados fictícios no nosso arquivo de factory. Veja só:

namespace Database\Factories;

use Illuminate\Database\Eloquent\Factories\Factory;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Str;

/**
 * @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\User>
 */
class UserFactory extends Factory
{
    /**
     * The current password being used by the factory.
     */
    protected static ?string $password;

    /**
     * Define the model's default state.
     *
     * @return array<string, mixed>
     */
    public function definition(): array
    {
        return [
            'name' => fake()->name(),
            'email' => fake()->unique()->safeEmail(),
            'email_verified_at' => now(),
            'password' => static::$password ??= Hash::make('password'),
            'remember_token' => Str::random(10),
        ];
    }

    /**
     * Indicate that the model's email address should be unverified.
     */
    public function unverified(): static
    {
        return $this->state(fn (array $attributes) => [
            'email_verified_at' => null,
        ]);
    }
}
Enter fullscreen mode Exit fullscreen mode

No exemplo acima, estamos utilizando a biblioteca Faker para gerar nossos dados fictícios. Essa biblioteca nos possibilita fazer imensas combinações para a criação desses dados. Vou deixar o link da biblioteca no final desse post.

Com isso definido, quando precisarmos da criação de usuários, podemos chamar da seguinte forma:

User::factory()->count(100)->create();
Enter fullscreen mode Exit fullscreen mode

Mas voltando ao assunto, já na parte dos seeders (semeadoras), eles são responsáveis por "semear" (popular) os dados da forma que desejamos. Para isso, você precisa criar uma seeder rodando novamente o comando do Artisan:

php artisan make:seeder UserSeeder
Enter fullscreen mode Exit fullscreen mode

Agora, vamos implementar a factory dentro da seeder e ajustar de acordo com a nossa necessidade. Veja como é simples:

use App\Models\User;

public function run(): void
{
    User::factory()
            ->count(50)
            ->create();
}
Enter fullscreen mode Exit fullscreen mode

No exemplo acima, criamos 50 usuários dentro do banco de dados de forma aleatório conforme definido na nossa fábrica de dados. Agora, devemos chamar esse seeder que criamos dentro do database/seeders/DatabaseSeeder.php, onde ele irá invocar todos os seeders que estiverem dentro dele e executar.

/**
 * Run the database seeders.
 */
public function run(): void
{
    $this->call([
        UserSeeder::class,
        ...
    ]);
}
Enter fullscreen mode Exit fullscreen mode

Agora para executar esse seeder principal, você deverá rodar o seguinte comando:

php artisan db:seed
Enter fullscreen mode Exit fullscreen mode

Com esse comando, você executará tudo o que estiver dentro do arquivo. Caso ainda deseje executar somente um seeder em específico, você pode executar o seguinte comando, passando a flag --class=NomeDoSeeder:

php artisan db:seed --class=UserSeeder
Enter fullscreen mode Exit fullscreen mode

Vantagens

Vimos acima como utilizar as factories (fábricas) e as seeders (semeadoras) nos trazem uma série de vantagens:

Redução de Tempo: Utilizando essas ferramentas, podemos ter o tempo de desenvolvimento reduzido, podendo aproveitar o tempo em demais funcionalidades da nossa aplicação.
Padronização: Como toda a equipe terá acesso a essas ferramentas, evita o famoso ditado "na minha máquina não funciona", trazendo consistência e confiança no desenvolvimento colaborativo.
Facilidade na manutenção: Ao invés de inserir dados manualmente quando algo muda, você simplesmente atualiza as factories e as seeders e seu problema já está resolvido.

Diferenças

Apesar de serem utilizadas em conjunto, não podemos esquecer de destacar a diferença entre elas:

Factories: Geram dados fictícios e aleatórios para testes e desenvolvimento rápido.
Seeders: Inserem dados fixos e essenciais para o banco de dados, como por exemplo, um cadastro de categorias pré-definido no projeto.

Bom, espero que esse artigo tenha sido proveitoso e que de alguma forma possa ter agregado conhecimento na sua vida profissional. No mais, muito obrigado por ter lido até aqui. Abraços!

Links Úteis
Biblioteca Faker
Seeders com Laravel
Factories com Laravel

Top comments (0)