Files
WMS/database/seeders/ModuleDatabaseSeeder.php
T
2026-09-21 10:14:57 +01:00

86 lines
2.5 KiB
PHP
Executable File

<?php
declare(strict_types=1);
namespace Database\Seeders;
use Illuminate\Database\Seeder;
use mpba\Modules\Facades\Module;
use Throwable;
final class ModuleDatabaseSeeder extends Seeder
{
/**
* Modules intentionally seeded elsewhere or excluded from module auto-seeding.
*
* @var array<int, string>
*/
private const SKIP_MODULES = [
// 'Platform',
// 'Pricing',
];
/**
* Seed all enabled Laravel modules that expose a module database seeder.
*/
public function run(): void
{
foreach (Module::allEnabled() as $module) {
$moduleName = $module->getName();
if (in_array($moduleName, self::SKIP_MODULES, true)) {
$this->command?->warn("Skipping module: {$moduleName} - excluded from automatic module seeding");
continue;
}
$seederClass = $this->resolveSeederClass($moduleName);
if ($seederClass === null) {
$this->command?->warn("Skipping module: {$moduleName} - no module seeder found");
continue;
}
$this->command?->info("Seeding module: {$moduleName}");
$this->command?->line("Seeder class: {$seederClass}");
try {
$this->call($seederClass);
} catch (Throwable $exception) {
$this->command?->error("Module seed failed: {$moduleName}");
$this->command?->error($exception->getMessage());
throw $exception;
}
$this->command?->info("Seeded module: {$moduleName}");
}
}
/**
* Resolve the module database seeder class using supported project patterns.
*/
private function resolveSeederClass(string $moduleName): ?string
{
$candidates = [
"Modules\\{$moduleName}\\Database\\Seeders\\{$moduleName}DatabaseSeeder",
"Modules\\{$moduleName}\\Database\\Seeders\\{$moduleName}Seeder",
"Modules\\{$moduleName}\\Database\\Seeders\\DatabaseSeeder",
// Legacy lowercase namespace variants used by some existing modules.
"Modules\\{$moduleName}\\database\\seeders\\{$moduleName}DatabaseSeeder",
"Modules\\{$moduleName}\\database\\seeders\\{$moduleName}Seeder",
"Modules\\{$moduleName}\\database\\seeders\\DatabaseSeeder",
];
foreach ($candidates as $candidate) {
if (class_exists($candidate)) {
return $candidate;
}
}
return null;
}
}