rewrite modular logic :D
This commit is contained in:
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
197
app/Modules/ModuleRepository.php
Normal file
197
app/Modules/ModuleRepository.php
Normal file
@@ -0,0 +1,197 @@
|
||||
<?php
|
||||
|
||||
namespace App\Modules;
|
||||
|
||||
use Illuminate\Support\Collection;
|
||||
use Illuminate\Support\Facades\File;
|
||||
use Illuminate\Support\Str;
|
||||
|
||||
class ModuleRepository
|
||||
{
|
||||
public function __construct(
|
||||
/** @var string */
|
||||
protected string $modules_path = '',
|
||||
|
||||
/** @var Collection<array-key, BaseModule> */
|
||||
protected Collection $modules = new Collection([]),
|
||||
|
||||
/** @var Collection<array-key, BaseModule> */
|
||||
protected Collection $allModules = new Collection([]),
|
||||
|
||||
/** @var array<int, string> */
|
||||
protected array $migrationsPaths = [],
|
||||
|
||||
/** @var array<int, class-string> */
|
||||
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<int, string> */
|
||||
$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<array-key, BaseModule>
|
||||
*/
|
||||
public function modules(): Collection
|
||||
{
|
||||
return $this->modules;
|
||||
}
|
||||
|
||||
/**
|
||||
* Empty module
|
||||
*/
|
||||
public function emptyModule(): ModuleContract
|
||||
{
|
||||
return new EmptyModule;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all modules regardless if disabled
|
||||
*
|
||||
* @return Collection<array-key, BaseModule>
|
||||
*/
|
||||
public function allModules(): Collection
|
||||
{
|
||||
return $this->allModules;
|
||||
}
|
||||
|
||||
/**
|
||||
* Migration paths
|
||||
*
|
||||
* @return array<int, string>
|
||||
*/
|
||||
public function migrationsPaths(): array
|
||||
{
|
||||
return $this->migrationsPaths;
|
||||
}
|
||||
|
||||
/**
|
||||
* Database seeders classes
|
||||
*
|
||||
* @return array<int, class-string>
|
||||
*/
|
||||
public function databaseSeederClasses(): array
|
||||
{
|
||||
return $this->databaseSeederClasses;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user