From aa5da6d4e47d0bc7d14e7abbf43029d451bbbc37 Mon Sep 17 00:00:00 2001 From: Stein Magne Bjorklund <steinmb@smbjorklund.com> Date: Mon, 20 Sep 2021 13:51:48 +0200 Subject: [PATCH] Create module loader --- classes/LoadModules.php | 72 +++++++++++++++++++++++++++++++ classes/modules/UnknownModule.php | 23 ++++++++++ index.php | 19 ++++---- 3 files changed, 106 insertions(+), 8 deletions(-) create mode 100644 classes/LoadModules.php create mode 100644 classes/modules/UnknownModule.php diff --git a/classes/LoadModules.php b/classes/LoadModules.php new file mode 100644 index 00000000..b15ccbd0 --- /dev/null +++ b/classes/LoadModules.php @@ -0,0 +1,72 @@ +<?php declare(strict_types=1); + +namespace uib\ub\loadspeakr; + +use uib\ub\loadspeakr\modules\ModuleInterface; +use uib\ub\loadspeakr\modules\UnknownModule; + +final class LoadModules +{ + private array $conf; + + public function __construct($conf) + { + $this->conf = $conf; + } + + public function loadModule(string $uri): ModuleInterface + { + $className = $this->loadClass($uri); + $unknown = new UnknownModule(); + + switch ($uri) { + case 'admin': + return new $className(); + case 'redirect': + return new $className(); + case 'service': + return new $className(); + case 'session': + return new $className(); + case 'sparqlfilter': + return new $className(); + case 'type': + return new $className(); + case 'uri': + return new $className(); + case 'export': + return new $className(); + case 'static': + return new $className(); + case 'default': + break; + } + + return $unknown; + } + + private function loadClass($module): string + { + if (!$this->moduleAvailable($module)) { + HTTPStatus::send500('Module: ' . $module . ' not found.'); + } + + $className = ucfirst($module) . 'Module'; + + if (file_exists(__DIR__ . '/modules/' . $className . '.php')) { + return __NAMESPACE__ . '\\modules\\' . $className; + } + + return ''; + } + + private function moduleAvailable(string $module): bool + { + if (!in_array($module, $this->conf['modules']['available'], true)) { + return false; + } + + return true; + } + +} \ No newline at end of file diff --git a/classes/modules/UnknownModule.php b/classes/modules/UnknownModule.php new file mode 100644 index 00000000..48f45017 --- /dev/null +++ b/classes/modules/UnknownModule.php @@ -0,0 +1,23 @@ +<?php declare(strict_types=1); + +namespace uib\ub\loadspeakr\modules; + +use uib\ub\loadspeakr\HTTPStatus; + +/** + * Null result Loadspkr module. + * + * Used when unknown module is requested. + */ +final class UnknownModule implements ModuleInterface +{ + + public function match($uri): void + { + HTTPStatus::send404($uri); + } + + public function execute($params): void + { + } +} diff --git a/index.php b/index.php index bf2a12d1..abc16855 100644 --- a/index.php +++ b/index.php @@ -4,6 +4,7 @@ use uib\ub\loadspeakr\Endpoint; use uib\ub\loadspeakr\Exporter; use uib\ub\loadspeakr\HTTPStatus; use uib\ub\loadspeakr\Importer; +use uib\ub\loadspeakr\LoadModules; use uib\ub\loadspeakr\Logging; use uib\ub\loadspeakr\Utils; @@ -65,22 +66,24 @@ if ($uri === $conf['basedir']) { $localUri = $conf['basedir'] . $_GET['q']; $uri = Utils::getMirroredUri($localUri); -// Load Loadspeakr modules. -foreach ($conf['modules']['available'] as $i) { - $className = ucfirst($i) . 'Module'; - $currentModule = $conf['modules']['directory'] . $className . '.php'; - $namespacedClassName = 'uib\ub\loadspeakr\modules\\' . $className; - $module = new $namespacedClassName(); +/** + * Load Loadspeakr modules. + */ +foreach ($conf['modules']['available'] as $loadspkrModule) { + $loader = new LoadModules($conf); + $module = $loader->loadModule($loadspkrModule); $matching = $module->match($uri); - if ($matching !== false) { + if ($matching) { $module->execute($matching); - if ($conf['logfile'] !== null) { fwrite($conf['logfile'], "]}"); fclose($conf['logfile']); } + /** + * Only run first Loadspeakr modules that matches. + */ exit(0); } } -- GitLab