コンテンツにスキップ
BlackOps1.xは試験的なバージョンです。Production Readyは2.xを予定しています。Releases
BlackOps
Esc
navigateopen⌘Jpreview
このページの内容

Seeder

Root Seeder、子Seederの明示順、Migration/Build/Seedの実行境界を確認する。

BlackOpsはApplication Databaseへ初期値、Development Fixture、Demo Dataを投入するため、Framework所有のdatabase:seed CommandとApplication所有のSeederを提供します。SeederはOperationではなく、HTTP LifecycleやJournalを通らない明示的な保守処理です。

Release: Database SeederはRepository mainのExperimental Surfaceです。Stable 1.1.0には含まれません。

Root Seeder

標準の入口はapp/Infrastructure/Seed/DatabaseSeeder.phpです。Install直後のSkeletonは空のRoot Seederを持つため、追加設定なしでCommandを実行できます。

<?php

declare(strict_types=1);

namespace App\Infrastructure\Seed;

use BlackOps\Database\Seeder;

final readonly class DatabaseSeeder implements Seeder
{
    public function run(): void {}
}

Seederを追加する場合はFramework所有Generatorを使います。

php blackops make:seeder Catalog/ProductSeeder

Root SeederはSeederRunnerをConstructor Injectionし、子Seederを実行順に列挙します。FrameworkはDirectory名やClass名から順序を推測しません。

<?php

declare(strict_types=1);

namespace App\Infrastructure\Seed;

use BlackOps\Database\Seeder;
use BlackOps\Database\SeederRunner;

final readonly class DatabaseSeeder implements Seeder
{
    public function __construct(private SeederRunner $seeders) {}

    public function run(): void
    {
        $this->seeders->run(
            Catalog\ProductSeeder::class,
            Catalog\PriceSeeder::class,
        );
    }
}

Rootと子SeederはBuild時に検出され、Compiled ContainerからDependencyを注入されます。SeederをService Providerへ個別登録する必要はありません。

実行順序

Migration、Build、Seedは互いを暗黙実行しません。Fresh InstallとDeploymentでは次の順に分けて実行します。

php blackops database:migrate
php blackops build:compile
php blackops database:seed

成功時はDatabase seeding completed.だけを表示します。Root未構成、古いBuild Artifact、Dependency解決失敗、Seeder例外は固定された安全なMessageと非0 Exitで返り、Throwable、SQL、投入値、Credentialを表示しません。

Applicationの責務

FrameworkはSeederの検出、DI、子Seeder実行、循環検出、安全なCommand境界を担当します。ApplicationはTransaction、再実行方針、固定Fixture、既存DataとのConflict判定を担当します。Frameworkは自動Transaction、truncate、upsert、Seed履歴、Production Environment推測を行いません。

同じSeederを繰り返し実行する運用では、Application側でIdempotentにするか、安全に拒否してください。Productionでの実行権限や対象EnvironmentもDeployment側で制御します。