Метод definition
Метод definition применяется в классе фабрики и определяет структуру данных для создания моделей. Этот метод должен возвращать массив, где ключи - имена полей, а значения - их содержимое. Чаще всего значения задаются через помощник fake, предоставляемый библиотекой Faker, для генерации реалистичных тестовых данных.
Синтаксис
<?php
class ModelFactory extends Factory
{
public function definition(): array
{
return [
'column_1' => 'value_1',
'column_2' => 'value_2',
];
}
}
?>
Пример
Давайте определим фабрику для модели Article с полями title, content и is_published:
<?php
namespace DatabaseFactories;
use AppModelsArticle;
use IlluminateDatabaseEloquentFactoriesFactory;
class ArticleFactory extends Factory
{
protected $model = Article::class;
public function definition(): array
{
return [
'title' => $this->faker->sentence(5),
'content' => $this->faker->paragraph(3),
'is_published' => $this->faker->boolean(),
];
}
}
?>
Теперь при использовании фабрики будут создаваться записи со случайными значениями:
<?php
use AppModelsArticle;
use DatabaseFactoriesArticleFactory;
$article = Article::factory()->create();
echo $article->title;
echo $article->content;
echo $article->is_published;
?>
Результат выполнения кода:
"Voluptatem amet magnam id ipsa laboriosam."
"Qui eum et laborum. Non ea voluptatibus atque aliquid rerum dolor. Maxime in voluptatem quas qui quaerat id expedita."
"1"
Пример
Определим фабрику для модели User с полями name, email и password:
<?php
namespace DatabaseFactories;
use AppModelsUser;
use IlluminateDatabaseEloquentFactoriesFactory;
use IlluminateSupportFacadesHash;
class UserFactory extends Factory
{
protected $model = User::class;
public function definition(): array
{
return [
'name' => $this->faker->name(),
'email' => $this->faker->unique()->safeEmail(),
'password' => Hash::make('password'),
];
}
}
?>
При создании нескольких пользователей все они будут иметь уникальные email-адреса:
<?php
use AppModelsUser;
$users = User::factory()->count(3)->create();
foreach ($users as $user) {
echo $user->email;
}
?>
Результат выполнения кода:
"john.doe@example.com"
"jane.smith@example.net"
"bob.johnson@example.org"