Состояния фабрики модели в Laravel
Если одну и ту же модель нужно создавать в разных вариантах - админ, заблокированный пользователь, черновик поста - удобны состояния фабрики.
Состояние описывают методом
в классе фабрики. Он возвращает
state с массивом полей:
<?php
public function admin(): static
{
return $this->state(fn (array $attributes) => [
'name' => 'admin',
'email' => 'admin@site.com',
'role' => 'admin',
]);
}
?>
Вызов состояния идет цепочкой
перед create:
<?php
User::factory()->admin()->create();
?>
Можно задать несколько состояний для одной фабрики:
<?php
public function draft(): static
{
return $this->state(fn (array $attributes) => [
'published' => false,
]);
}
public function published(): static
{
return $this->state(fn (array $attributes) => [
'published' => true,
]);
}
?>
Состояния переиспользуют в тестах и сидерах - не нужно каждый раз передавать один и тот же массив атрибутов вручную.
Добавьте состояние banned
для пользователя с полем
is_banned равным 1.
Чем состояние удобнее разового
массива в create?