As novas Factories no Laravel 8
A nova versão do maior framework PHP está aí com várias novidades, entre elas uma nova forma de se trabalhar com Factory.
O que mudou?
Várias coisas no Framework foram alteradas nessa nova versão, como por exemplo a criação do diretório Models, agora alterações no .env são aplicadas na aplicação sem a necessidade de reiniciar o servidor, e além de outras mudanças.
Mas o que vamos discutir aqui é o novo modo de usar o Factory, vale a pena ressaltar que a forma ‘antiga’ está depreciada e não irá mais funcionar nas versões futuras do Laravel, porém a equipe de desenvolvimento do framework ‘quebrou o galho’ e disponibilizou um pacote que irá permitir que o Laravel leia as factories no formato antigo (embora o recomendado seja aprender a nova maneira), caso queira saber mais do pacote dê uma olhada no Packagist.
Bom, falando de um modo rápido, agora os arquivos Factory são classes, essas classes extendem a classe principal Factory.
Isso permite uma interação melhor das Factories com seus respectivos Models, de modo que agora quando quisermos executar uma Factory podemos chamá-la através do seu Model deixando o código mais semântico e dinâmico.
Beleza, mas como funciona isso na prática?
Para exemplificar, vou criar uma Factory que vai popular uma tabela de livros. O foco do artigo não é explicar o que é uma Factory portanto não irei me apegar em detalhes, caso não saiba o que é uma Factory, leia o meu artigo falando sobre (pode estar desatualizado mas o conceito é o mesmo).
Factory
Primeiro vamos criar a factory:
php artisan make:factory BooksFactory --model=Book
Você vai encontrar uma classe mais ou menos parecida com essa:
Basicamente, a propriedade $model
se refere ao modelo da tabela, temos que ter em mente que é necessário que exista um Model na sua aplicação que referencie à tabela que você irá popular.
Logo abaixo, você vai encontrar o método definition()
, esse método será executado quando sua Factory for chamada, ele deverá retornar um array associativo com coluna e valor, mais ou menos dessa forma:
[
'coluna_1' => 'valor_1',
'coluna_2' => 'valor_2'
]
Claro, o que está acima é só um exemplo, na prática para popular os campos vamos usar o Faker.
O Faker agora é uma propriedade (protegida) da classe Factory, ou seja, ele pode ser acessado pela sua classe através do $this
.
Tendo tudo isso em mente, vamos setar esse método definition
:
public function definition()
{
return [ // O campo titulo vai receber palavras aleatorias
'title' => $this->faker->sentence(3), // O campo paginas vai receber um numero aleatorio
'pages' => $this->faker->numberBetween(100, 520) // O campo author vai receber algum nome aleatorio
'author' => $this->faker->name ];
}
Isso é o suficiente na Factory, agora vamos pro Model.
No Model, vamos declarar que usaremos um método chamado HasFactory
que, por acaso, é fornecido pelo Eloquent.
class Book extends Model
{
use \Illuminate\Database\Eloquent\Factories\HasFactory;
}
Vale ressaltar que agora os Models estão em app/Models/
No Model isso também é o suficiente, agora vamos rodar a Factory.
Rodando a Factory
Você já deve saber que as factories são executadas pelas Seeds da aplicação, tendo isso em mente vamos fazer uma última config.
No DatabaseSeeder.php
, especificamente no método run
, vamos chamar o nosso Model (sim, o Model) e invocar seu método estático factory,
esse método vai receber um número inteiro que corresponderá a quantidade de registros a serem criados, e por fim, vamos encadear o método create
, vai ficar mais ou menos assim:
class DatabaseSeeder extends Seeder
{
public function run()
{ // Chame o post e use a factory para criar 20 registros
\App\Models\Book::factory(20)->create(); }
}
Finalmente! Todas as peças posicionadas, basta agora executar e inserir múltiplos registros na base de dados:
php artisan db:seed
Registros inseridos com sucesso!
Conclusão
E aí dev, o que achou? Acredito que eu tenha conseguido transmitir o que queria.
Eu resolvi escrever esse artigo por conta que muita gente nem sequer sabia da nova versão do Laravel, ou então não entendeu as mudanças feitas pela equipe de desenvolvimento do projeto, o objetivo aqui foi trazer algumas dessas mudanças de maneira simples e ‘redonda’ para facilitar o aprendizado.
Eu estou trabalhando em um repositório onde estou colocando as principais changes feitas da versão 7.x para a 8.x, caso você queira ver na prática como fica algumas coisas dê uma olhada aqui.
Não deixe de ler o Upgrade Guide do framework e também a parte de Factories da documentação oficial.
Bons Estudos!