Команда make:factory
Команда make:factory создаёт новый класс фабрики в директории database/factories. Фабрики используются для определения шаблонов генерации тестовых данных, которые затем применяются в сидерах и тестах. Первым аргументом передаётся имя фабрики, вторым - опциональная модель, для которой она создаётся.
Синтаксис
php artisan make:factory FactoryName
php artisan make:factory FactoryName --model=ModelName
Основные параметры команды:
FactoryName- имя создаваемого класса фабрики--model- опциональный параметр, указывающий модель, для которой создаётся фабрика
Пример
Создадим фабрику для модели Article:
<?php
namespace Database\Factories;
use App\Models\Article;
use Illuminate\Database\Eloquent\Factories\Factory;
use Illuminate\Support\Str;
class ArticleFactory extends Factory
{
protected $model = Article::class;
public function definition()
{
return [
'title' => $this->faker->sentence,
'content' => $this->faker->paragraphs(3, true),
'status' => $this->faker->randomElement(['draft', 'published']),
'views' => $this->faker->numberBetween(0, 1000),
'is_active' => $this->faker->boolean(80),
];
}
}
?>
В этом примере фабрика определяет правила генерации данных для модели Article. Метод definition возвращает массив со значениями полей, используя Faker для генерации реалистичных данных.
Пример
Создадим фабрику с явным указанием модели через параметр --model:
php artisan make:factory UserFactory --model=User
<?php
namespace Database\Factories;
use App\Models\User;
use Illuminate\Database\Eloquent\Factories\Factory;
use Illuminate\Support\Facades\Hash;
class UserFactory extends Factory
{
protected $model = User::class;
public function definition()
{
return [
'name' => $this->faker->name,
'email' => $this->faker->unique()->safeEmail,
'password' => Hash::make('password'),
'remember_token' => Str::random(10),
];
}
}
?>
При указании параметра --model Laravel автоматически связывает фабрику с указанной моделью и подставляет её в свойство $model.
Пример
Рассмотрим использование фабрики для создания записей в сидерах:
<?php
namespace Database\Seeders;
use App\Models\Article;
use App\Models\User;
use Illuminate\Database\Seeder;
class DatabaseSeeder extends Seeder
{
public function run()
{
// Создание 10 статей
Article::factory()->count(10)->create();
// Создание 5 пользователей
User::factory()->count(5)->create();
// Создание статьи с конкретными значениями
Article::factory()->create([
'title' => 'Special Article',
'status' => 'published',
]);
}
}
?>
Пример
Использование фабрики в тестах для генерации тестовых данных:
<?php
namespace Tests\Feature;
use App\Models\Article;
use App\Models\User;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;
class ArticleTest extends TestCase
{
use RefreshDatabase;
public function test_articles_index()
{
// Создаём пользователя
$user = User::factory()->create();
// Создаём 5 статей для пользователя
$res = Article::factory()
->count(5)
->create(['user_id' => $user->id]);
$this->assertCount(5, $res);
}
}
?>
Результат выполнения кода:
"Test passed successfully"
Смотрите также
-
команда
db:seed,
которая заполняет базу данных тестовыми записями -
команда
make:seeder,
которая создаёт класс сидера -
команда
make:model,
которая создаёт новую модель Eloquent -
команда
make:migration,
которая создаёт новый файл миграции