ORM Eloquent: Factory
Quando vamos realizar testes na aplicao, persistimos alguns registros para validaes mais simples, tarefa rdua pois precisamos simular dados fictcios para inserir na aplicao.
H servios on-line onde podemos baixar esses dados em formato json, mas mesmo esses facilitadores apresentam limitaes no schema, resultando em mais trabalho para adequar o schema ao contexto do projeto.
Felizmente, o ORM Eloquent disponvel no Laravel possui uma classe com mtodos para gerao de diversos tipos de dados fictcios, onde a grande vantagem poder utilizar os modelos da prpria aplicao para persistir as informaes.
Estou me referindo classe abstrata Illuminate\Database\Eloquent\Factories\Factory
.
Ao longo deste artigo vou mostrar alguns mtodos para criao de informaes fictcias para cada modelo. No haver interao com a camada de persistncia e todo o contedo deste artigo pode ser encontrado na documentao oficial aqui.
recomendvel conhecimento prvio sobre Laravel.
Contedo
Este artigo est organizado de forma a facilitar a busca por informaes. Se voc quiser mais detalhes acerca do funcionamento da classe Factory, sugiro ler os itens 1 e 2.
Mas se voc est buscando saber como gerar tipos especficos, ento seu destino est entre os itens 3 e 8.
Boa leitura.
- Por onde comear
- Gerando informaes fictcias
- Dados pessoais
- Endereo
- Texto
- Nmeros
- Data e hora
- Outros
Por onde comear
A maneira mais prtica de criar uma classe que estenda de \Eloquent\Factories\Factory atravs do Artisan. Utilizando qualquer terminal, acesse o diretrio raiz da aplicao e digite o seguinte comando:
php artisan make:factory <nome_da_factory>
Assim que o comando for executado um novo arquivo ser criado no no diretrio \database\factories\ com o contedo mostrado logo a seguir:
<?phpnamespace Database\Factories;use Illuminate\Database\Eloquent\Factories\Factory;/** * @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\Model> */class SampleFactory extends Factory{ /** * Define the model's default state. * * @return array<string, mixed> */ public function definition() { return [ // ]; }}
A classe que acabamos de criar possui apenas um mtodo, chamado definition
onde toda mgica acontece e como podemos ver na assinatura desse mtodo o retorno um array de string/valor, ou algo como 'propriedade' => 'valor'
.
Embora a declarao do mtodo indique que ele retornar o estado padro do modelo esta classe totalmente desacoplada do modelo (Illuminate\Database\Eloquent\Model) dentro de aplicaes Laravel.
H duas formas de retornarmos informaes para o mtodo definition
. A primeira utilizar a propriedade protegida faker
que extende de abastrata Eloquent\Factories\Factory ou atravs do helper fake()
.
A principal diferena que no helper fake()
podemos passar o dialeto ($locale) para gerao das informaes, aumentando a assertividade dos dados.
Abaixo est a assinatura do mtodo fake()
.
/** * Get a faker instance. * * @param ?string $locale * @return \Faker\Generator */function fake($locale = null)
Gerando informaes fictcias
Para o mesmo tipo de dado o mtodo fake() disponibiliza, quando disponvel, duas formas de gerar informaes.
A primeira consultando diretamente uma propriedade.
Por exemplo, para criar nomes fictcios utilizamos o seguinte cdigo:
fake()->name
E a segunda chamando um mtodo que retorna o nome, tambm fictcio, conforme o cdigo abaixo:
fake()->name()
A vantagem no mtodo name()
a existncia do argumento opcional $gender
que define o gnero do nome a ser criado.
A seguir vou listar vrios tipos de dados que podem ser gerados, agrupando-os em categorias para facilitar a busca e utilizao.
Dados pessoais
Este grupo de mtodos retorna diversas informaes pessoais, de nomes a nmeros de telefone. A tabela a seguir traz o nome da propriedade e qual retorno fornecido.
Propriedade | Retorno |
---|---|
fake()->name | nome completo |
fake()->lastName | sobrenome |
fake()->firstNameMale | primeiro nome masculino |
fake()->firstNameFemale | primeiro nome feminino |
fake()->jobtitle | ttulo (profisso) |
fake()->phoneNumber | nmero de telefone |
Endereo
Esta categoria traz opes diversas opes para endereo como podemos ver na tabela a seguir.
Propriedade | Retorno |
---|---|
fake()->address | endereo completo |
fake()->streetAddress | logradouro com nmero |
fake()->streetName | somente logradouro |
fake()->buildingNumber | nmero do prdio |
fake()->city | cidade |
fake()->country | pas |
fake()->postcode | CEP |
Texto
"...Lorem ipsum em design grfico e editorao um texto padro em latim utilizado na produo grfica para preencher os espaos de texto em publicaes...". Fonte: Wikipedia.
Esta categoria possibilita a gerao de palavras nicas at pargrafos completos.
Mas, diferentemente das categorias anteriores onde os retornos so sempre strings, algumas propriedades desta categoria retornam array de strings.
Este comportamento pode ser evitado utilizando o mtodo correspondente no lugar da propriedade.
Por exemplo, a propriedade fake()->words
retornar um array com 3 strings diferentes, ao passo que o mtodo fake()-words(3, true)
tambm retornar 3 palavras mas em uma nica string.
A tabela a seguir traz as propriedades com seus respectivos retornos e para cada propriedade h um mtodo correspondente.
Propriedade | Retorno |
---|---|
fake()->randomLetter | uma letra |
fake()->word | uma nica palavra |
fake()->words | array com 3 palavras |
fake()->sentence | uma frase com at 6 palavras |
fake()->sentences | array com 3 frases |
fake()->paragraph | pargrafo com 3 frases |
fake()->paragraphs | array com 3 pargrafos |
fake()->text | texto com at 200 palavras |
Nmeros
Este grupo destina-se a gerao de nmeros fictcios, sejam inteiros ou reais. Vamos tabela com os mtodos e os respectivos retornos.
Suprimi o fake()->
para melhorar a visualizao da tabela.
Mtodo | Retorno |
---|---|
numberBetween($int1 = 0, $int2 = 2147483647) | inteiro entre $int1 e $int2 |
randomDigit() | inteiro entre 0 e 9 |
randomDigitNot($except) | inteiro entre 0 e 9, exceto $except |
randomDigitNotZero() | inteiro entre 1 e 9 |
randomFloat($nbMaxDecimals = null, $min = 0, $max = null) | nmero real com $nbMaxDecimals casas decimais, maior ou igual a $min e menor ou igual a $max |
Data e hora
Esta categoria retorna informaes de data e hora, fictcios.
Propriedade | Retorno |
---|---|
fake()->dateTime | data e hora, at a atual |
fake()->date | data no formato 'Y-m-d', at a atual |
fake()->time | hora no formato 'H:i:s', at a atual |
fake()->dateTimeThisCentury | data e hora do sculo corrente |
fake()->dateTimeThisDecade | data e hora da dcada corrente |
fake()->dateTimeThisYear | data e hora do ano corrente |
fake()->dateTimeThisMonth | data e hora do ms corrente |
fake()->dayOfMonth | dia do ms |
fake()->dayOfWeek | dia da semana |
fake()->month | ms (numeral) |
fake()->monthName | ms (extenso) |
fake()->year | ano |
fake()->century | sculo |
Outros
Esta categoria traz propriedades bastante diversas e por isso, vou listar somente algumas.
Propriedade | Retorno |
---|---|
fake()->hexColor | cor em hexadecimal |
fake()->rgbColor | cor em RGB |
fake()->rgbCssColor | cor RGB em CSS |
fake()->colorName | nome da cor |
fake()->userName | nome de usurio |
fake()->password | senha de 6 a 20 caracteres |
fake()->domainName | nome de domnio |
fake()->url | url |
fake()->ipv4 | endereo de rede IPV4 |
fake()->ipv6 | endereo de rede IPV6 |
fake()->macAddress | endereo "mac" de placa de rede |
Muita coisa no mesmo?!
Espero ter ajudado.
At breve.
Original Link: https://dev.to/marciopolicarpo/orm-eloquent-factory-2nk8
Dev To
An online community for sharing and discovering great ideas, having debates, and making friendsMore About this Source Visit Dev To