getSeedClasses(); $orderedSeeds = $this->orderedSeeds($seedClasses); foreach ($orderedSeeds as $seed) { $seed->run(); } } protected function getSeedClasses(): array { $seedsFolder = implode(DIRECTORY_SEPARATOR, [__DIR__, 'Seeds']); $files = new FilesystemIterator($seedsFolder, FilesystemIterator::SKIP_DOTS); $seeds = []; foreach ($files as $file) { $seeds []= $this->buildClassName($file->getBasename('.php')); } return $seeds; } protected function getSeed(string $seedClassName): SeedInterface { return new $seedClassName($this->connection); } protected function buildClassName(string $fileBaseName): string { $namespace = implode('\\', [__NAMESPACE__, 'Seeds']); return implode('\\', [$namespace, $fileBaseName]); } protected function orderedSeeds(array $seedClasses): array { $orderedSeeds = []; foreach ($seedClasses as $seedClassName) { $seed = $this->getSeed($seedClassName); if ($seed->getDependencies() === []) { $orderedSeeds[$seedClassName] = $seed; continue; } $orderedSeeds = array_merge($orderedSeeds, $this->orderedDependencies($orderedSeeds, $seedClasses, $seedClassName)); } return $orderedSeeds; } protected function orderedDependencies(array $orderedSeeds, array $seedClasses, string $seedClassName): array { $seed = $this->getSeed($seedClassName); $dependencies = $seed->getDependencies(); foreach ($dependencies as $dependencyClass) { if (!array_key_exists($dependencyClass, $orderedSeeds)) { $orderedSeeds = array_merge($orderedSeeds, $this->orderedDependencies($orderedSeeds, $seedClasses, $dependencyClass)); } } if (!array_key_exists($seedClassName, $orderedSeeds)) { $orderedSeeds[$seedClassName] = $seed; } return $orderedSeeds; } }