РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
1241 of 1392 menu

Метод state

Метод state применяется к фабрике модели и позволяет задавать альтернативные наборы атрибутов для разных состояний. Первым параметром передаётся название состояния, вторым - массив или замыкание с атрибутами. Метод возвращает экземпляр фабрики с применённым состоянием.

Синтаксис

<?php use AppModelsUser; User::factory()->state('admin', [ 'role' => 'admin', 'is_active' => true ]); ?>

Пример

Давайте определим состояние 'admin' для модели User:

<?php namespace DatabaseFactories; use AppModelsUser; use IlluminateDatabaseEloquentFactoriesFactory; class UserFactory extends Factory { protected $model = User::class; public function definition() { return [ 'name' => $this->faker->name, 'email' => $this->faker->unique()->safeEmail, 'role' => 'user', 'is_active' => true ]; } public function admin() { return $this->state([ 'role' => 'admin', 'is_active' => true ]); } } ?>

Пример

Создадим пользователя с состоянием 'admin' в тесте:

<?php namespace TestsUnit; use TestsTestCase; use AppModelsUser; use IlluminateFoundationTestingRefreshDatabase; class UserTest extends TestCase { use RefreshDatabase; public function test_admin_user_creation() { $user = User::factory() ->admin() ->create(); $this->assertEquals('admin', $user->role); } } ?>

Результат выполнения кода:

"User created with admin role"

Пример

Используем замыкание для динамического определения состояния:

<?php namespace DatabaseFactories; use AppModelsPost; use IlluminateDatabaseEloquentFactoriesFactory; class PostFactory extends Factory { protected $model = Post::class; public function definition() { return [ 'title' => $this->faker->sentence, 'content' => $this->faker->paragraph, 'published' => false ]; } public function published() { return $this->state(function (array $attributes) { return [ 'published' => true, 'published_at' => now() ]; }); } } ?>

Пример

Применим состояние 'published' при создании поста:

<?php namespace TestsUnit; use TestsTestCase; use AppModelsPost; use IlluminateFoundationTestingRefreshDatabase; class PostTest extends TestCase { use RefreshDatabase; public function test_published_post_creation() { $post = Post::factory() ->published() ->create(); $this->assertTrue($post->published); $this->assertNotNull($post->published_at); } } ?>

Результат выполнения кода:

"Post created and published successfully"

Пример

Комбинируем несколько состояний для создания сложных сценариев:

<?php namespace DatabaseFactories; use AppModelsUser; use IlluminateDatabaseEloquentFactoriesFactory; class UserFactory extends Factory { protected $model = User::class; public function definition() { return [ 'name' => $this->faker->name, 'email' => $this->faker->unique()->safeEmail, 'role' => 'user', 'is_active' => true, 'verified' => false ]; } public function admin() { return $this->state([ 'role' => 'admin' ]); } public function inactive() { return $this->state([ 'is_active' => false ]); } public function verified() { return $this->state([ 'verified' => true, 'email_verified_at' => now() ]); } } ?>

Пример

Применим сразу несколько состояний к одной фабрике:

<?php namespace TestsUnit; use TestsTestCase; use AppModelsUser; use IlluminateFoundationTestingRefreshDatabase; class UserTest extends TestCase { use RefreshDatabase; public function test_inactive_verified_admin_creation() { $user = User::factory() ->admin() ->inactive() ->verified() ->create(); $this->assertEquals('admin', $user->role); $this->assertFalse($user->is_active); $this->assertTrue($user->verified); } } ?>

Результат выполнения кода:

"Custom user created with multiple states"

Смотрите также

  • метод definition,
    который определяет базовые атрибуты фабрики
  • метод create,
    который создаёт и сохраняет модель в базе данных
  • метод make,
    который создаёт модель без сохранения в базу
  • метод sequence,
    который определяет последовательность атрибутов
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить