From eb43d4ad863095246ae7a4b98807d55adc41854d Mon Sep 17 00:00:00 2001 From: Nurmuhammet Allanov Date: Tue, 5 Nov 2024 21:04:56 +0500 Subject: [PATCH] rewrite modular logic :D --- app/Helpers/helpers.php | 79 +++-------- app/Modules/BaseModule.php | 7 +- app/Modules/ModuleRepository.php | 197 +++++++++++++++++++++++++++ app/Providers/AppServiceProvider.php | 16 +-- database/seeders/DatabaseSeeder.php | 21 +-- 5 files changed, 230 insertions(+), 90 deletions(-) create mode 100644 app/Modules/ModuleRepository.php diff --git a/app/Helpers/helpers.php b/app/Helpers/helpers.php index 3a09992..01d7905 100644 --- a/app/Helpers/helpers.php +++ b/app/Helpers/helpers.php @@ -1,16 +1,14 @@ path().'/'.$path; +} + +/** + * Get module + */ +function module(string $moduleName): ModuleContract +{ + return modular()->module($moduleName); } /** @@ -62,41 +51,15 @@ function modules_path(string $path = ''): string */ function modules(bool $withDisabled = false): Collection { - if (temp_cache()->has('modules')) { - /** @var Collection $modules */ - $modules = temp_cache('modules'); + return $withDisabled ? modular()->allModules() : modular()->modules(); +} - return $modules; - } - - /** @var array */ - $modulesDir = File::directories(modules_path()); - $modules = collect(); - - foreach ($modulesDir as $modulePath) { - $moduleName = Str::afterLast($modulePath, '/'); - - $module = new BaseModule( - path: $modulePath, - name: $moduleName, - enabled: module($moduleName)->isEnabled() - ); - - // Include all - if ($withDisabled) { - $modules->push($module); - - continue; - } - - if ($module->enabled) { - $modules->push($module); - } - } - - temp_cache()->put('modules', $modules); - - return $modules; +/** + * Empty module + */ +function emptyModule(): ModuleContract +{ + return modular()->emptyModule(); } /** diff --git a/app/Modules/BaseModule.php b/app/Modules/BaseModule.php index 1f9a7ce..483535d 100644 --- a/app/Modules/BaseModule.php +++ b/app/Modules/BaseModule.php @@ -7,6 +7,9 @@ class BaseModule public function __construct( public string $path, public string $name, - public bool $enabled, - ) {} + public ModuleContract $app, + public bool $enabled = false, + ) { + $this->enabled = $this->app->isEnabled(); + } } diff --git a/app/Modules/ModuleRepository.php b/app/Modules/ModuleRepository.php new file mode 100644 index 0000000..e6c6596 --- /dev/null +++ b/app/Modules/ModuleRepository.php @@ -0,0 +1,197 @@ + */ + 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 + * + * @param bool|bool $withDisabled + */ + 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; + } +} diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index d676a94..1d953cf 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -2,7 +2,8 @@ namespace App\Providers; -use App\Modules\BaseModule; +use App\Modules\ModuleRepository; +use Illuminate\Contracts\Foundation\Application; use Illuminate\Database\Eloquent\Model; use Illuminate\Support\ServiceProvider; @@ -13,7 +14,9 @@ class AppServiceProvider extends ServiceProvider */ public function register(): void { - // + $this->app->singleton(ModuleRepository::class, function (Application $app) { + return new ModuleRepository; + }); } /** @@ -34,13 +37,6 @@ class AppServiceProvider extends ServiceProvider */ public function registerModules(): void { - $migrationDirectories = []; - modules()->each(function (BaseModule $module) use (&$migrationDirectories) { - is_dir($module->path.'/Database/Migrations') - ? array_push($migrationDirectories, $module->path.'/Database/Migrations') - : ''; - }); - - $this->loadMigrationsFrom($migrationDirectories); + $this->loadMigrationsFrom(modular()->migrationsPaths()); } } diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php index 7e973cf..1642e76 100644 --- a/database/seeders/DatabaseSeeder.php +++ b/database/seeders/DatabaseSeeder.php @@ -4,9 +4,7 @@ namespace Database\Seeders; // use Illuminate\Database\Console\Seeds\WithoutModelEvents; -use App\Modules\BaseModule; use Illuminate\Database\Seeder; -use Illuminate\Support\Facades\File; class DatabaseSeeder extends Seeder { @@ -16,24 +14,7 @@ class DatabaseSeeder extends Seeder public function run(): void { $seeders = []; - - modules()->each(function (BaseModule $module) use (&$seeders) { - $seedersPath = $module->path.'/Database/Seeders'; - - if (is_dir($seedersPath)) { - $files = File::files($seedersPath); - - foreach ($files as $file) { - $file->getFilenameWithoutExtension(); - - $moduleClass = 'App\\Modules\\'.$module->name.'\\Database\\Seeders\\'.$file->getFilenameWithoutExtension(); - - if (class_exists($moduleClass)) { - $seeders[] = $moduleClass; - } - } - } - }); + // $seeders = modular()->databaseSeederClasses(); $this->call($seeders); }