Commands Overview

osdd:seed

Run all seeders registered across all layers.

osdd:seed runs every seeder that has been registered in any layer's service provider via loadSeeders().

Usage

Terminal
php artisan osdd:seed

Options

OptionDescription
--freshRuns migrate:fresh before seeding (drops all tables and re-runs all migrations)
--refreshRuns migrate:refresh before seeding (rolls back and re-runs all migrations)

If both --fresh and --refresh are supplied, --fresh takes precedence. If the migration step fails, seeding is aborted.

Terminal
# Drop all tables, re-run migrations, then seed
php artisan osdd:seed --fresh

# Roll back and re-run migrations, then seed
php artisan osdd:seed --refresh

How It Works

OSDD maintains a SeederRegistry singleton in the IoC container. When a layer's service provider calls loadSeeders(), the seeder class-strings are pushed into the registry.

When osdd:seed runs, it:

  1. Optionally runs migrate:fresh or migrate:refresh (if the corresponding flag is passed)
  2. Resolves the SeederRegistry from the container
  3. Iterates over all registered seeder class-strings in priority order
  4. Calls php artisan db:seed --class={SeederClass} for each one

Registering Seeders

Seeders must be registered in a layer's service provider:

src/Providers/OrdersServiceProvider.php
<?php

namespace Functional\Orders\Providers;

use Xefi\LaravelOSDD\LayerServiceProvider;
use Functional\Orders\Database\Seeders\OrdersSeeder;
use Functional\Orders\Database\Seeders\OrderStatusSeeder;

class OrdersServiceProvider extends LayerServiceProvider
{
    public function boot(): void
    {
        $this->loadSeeders([
            OrdersSeeder::class,
            OrderStatusSeeder::class,
        ]);
    }
}

Seeder Execution Order

By default all seeders have priority 0 and run in registration order. Pass a numeric $priority as the second argument to loadSeeders() to control the order — lower numbers run first.

// Runs first — foundational data
$this->loadSeeders([RolesSeeder::class], priority: -10);

// Runs second — default priority
$this->loadSeeders([OrdersSeeder::class]);

// Runs last — depends on orders existing
$this->loadSeeders([InvoicesSeeder::class], priority: 10);

Seeders with the same priority maintain their registration order (stable sort).

Example Seeder

database/seeders/OrdersSeeder.php
<?php

namespace Functional\Orders\Database\Seeders;

use Illuminate\Database\Seeder;
use Functional\Orders\Models\Order;

class OrdersSeeder extends Seeder
{
    public function run(): void
    {
        Order::factory()->count(50)->create();
    }
}
osdd:seed is the OSDD equivalent of a central DatabaseSeeder that calls all domain seeders. The key difference is that each layer is responsible for registering its own seeders — there is no single file to edit when adding a new domain.