Їх часто плутають, бо обидва створюють записи. Різниця в тому, що саме вони створюють.
Фабрика описує, як виглядає один правдоподібний запис:
class VacancyFactory extends Factory
{
public function definition(): array
{
return [
'title' => fake()->jobTitle(),
'level' => fake()->randomElement(VacancyLevel::cases()),
'is_published' => true,
];
}
public function draft(): static
{
return $this->state(fn () => ['is_published' => false]);
}
}
Використовується переважно в тестах, де потрібен запис із конкретною властивістю:
$vacancy = Vacancy::factory()->draft()->create();
Сідер заповнює базу набором даних - і зазвичай викликає фабрики:
class DatabaseSeeder extends Seeder
{
public function run(): void
{
$this->call(RolesSeeder::class); // довідник: конкретні значення
Vacancy::factory()->count(50)->create(); // демо-дані: випадкові
}
}
Коли що потрібне:
- Довідники - ролі, категорії, статуси, налаштування. Це реальні дані застосунку, у них немає випадковості, і вони мають бути ідемпотентними:
firstOrCreate()абоupdateOrCreate(), щоб повторний запуск не плодив дублів. - Демо-дані для локальної розробки - фабрики всередині сідера.
- Тести - фабрики напряму, без сідера: кожен тест створює рівно те, що перевіряє.
Головне правило: сідер із довідником має бути безпечним для повторного запуску, бо його виконують і на проді. Сідер з демо-даними на прод не потрапляє взагалі.