*/ protected Collection $modules = new Collection([]), /** @var Collection */ protected Collection $allModules = new Collection([]), /** @var array */ protected array $migrationsPaths = [], /** @var array */ protected array $databaseSeederClasses = [], ) { $this->prepareModules(); } /** * Prepare modules */ public function prepareModules(): void { $this->setPath(); $this->setModules(); $this->setConfigurations(); } /** * Set path */ public function setPath(): void { $this->modules_path = __DIR__; } /** * Set modules */ public function setModules(bool $withDisabled = false): void { /** @var array */ $modulesDir = File::directories($this->path()); foreach ($modulesDir as $modulePath) { $moduleName = Str::afterLast($modulePath, '/'); $module = new BaseModule( path: $modulePath, name: $moduleName, app: $this->module($moduleName), ); $this->allModules->push($module); // Include all if ($withDisabled) { $this->modules->push($module); continue; } if ($module->app->isEnabled()) { $this->modules->push($module); } } } /** * Set configs */ public function setConfigurations(): void { $this->modules()->each(function (BaseModule $module) { $this->setMigrations($module); $this->setSeeders($module); }); } /** * Gather module migrations and set it */ public function setMigrations(BaseModule $module): void { $migrationDirectory = $module->path.'/Database/Migrations'; if (is_dir($migrationDirectory)) { $this->migrationsPaths[] = $migrationDirectory; } } /** * Set seeders */ public function setSeeders(BaseModule $module): void { $seedersPath = $module->path.'/Database/Seeders'; if (is_dir($seedersPath)) { $files = File::files($seedersPath); foreach ($files as $file) { $seederClassPath = 'App\\Modules\\'.$module->name.'\\Database\\Seeders\\'.$file->getFilenameWithoutExtension(); if (class_exists($seederClassPath)) { $this->databaseSeederClasses[] = $seederClassPath; } } } } /** * Modules path */ public function path(): string { return $this->modules_path; } /** * Instantiate new module class if exists */ public function module(string $moduleName): ModuleContract { $moduleClass = 'App\\Modules\\'.$moduleName.'\\'.$moduleName.'Module'; if (class_exists($moduleClass)) { /** @var ModuleContract $module */ $module = new $moduleClass; return $module; } return $this->emptyModule(); } /** * Modules * * @return Collection */ public function modules(): Collection { return $this->modules; } /** * Empty module */ public function emptyModule(): ModuleContract { return new EmptyModule; } /** * Get all modules regardless if disabled * * @return Collection */ public function allModules(): Collection { return $this->allModules; } /** * Migration paths * * @return array */ public function migrationsPaths(): array { return $this->migrationsPaths; } /** * Database seeders classes * * @return array */ public function databaseSeederClasses(): array { return $this->databaseSeederClasses; } }