Seeder
Root/child 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は公開済みExperimental Stable
1.2.1のSurfaceです。Frameworkの検出とDIを使い、ApplicationがDataと再実行方針を所有します。
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側で制御します。
Root未構成や古いArtifactで失敗した場合は、Application-owned Seeder/Migrationを修正し、database:migrate、build:compile、database:seedの順で再実行します。既存DataやCredentialをCommandへ貼り付けません。
次に保持期間を確認する
初期DataとRuntime Dataの保持を分ける場合は、RetentionでPlan、Hold、Purge Auditを確認します。