From 3df8f36c2dd72841e9a1de9acd19c1526830373b Mon Sep 17 00:00:00 2001 From: Sebastian Hopfe Date: Fri, 8 Apr 2022 15:10:34 +0200 Subject: [PATCH 1/3] fix - loadModule reinitializes modules if the module has already been loaded #32 Signed-off-by: Sebastian Hopfe --- src/ModuleManager.php | 33 +++++++++++++++++++++++++++++++++ test/ModuleManagerTest.php | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 65 insertions(+) diff --git a/src/ModuleManager.php b/src/ModuleManager.php index d388ba3..39e6227 100644 --- a/src/ModuleManager.php +++ b/src/ModuleManager.php @@ -128,10 +128,26 @@ public function loadModule($module) $module = current($module); } + // search for a specific name if (isset($this->loadedModules[$moduleName])) { return $this->loadedModules[$moduleName]; } + // when no specific name is found, try the complete class-string + $verifiedModulName = $this->getVerifiedModuleName($moduleName); + if (isset($this->loadedModules[$verifiedModulName])) { + return $this->loadedModules[$verifiedModulName]; + } + + // when no class-string is found, try search for a namespace + if (class_exists($verifiedModulName)) { + $moduleReflection = new \ReflectionClass($verifiedModulName); + + if (isset($this->loadedModules[$moduleReflection->getNamespaceName()])) { + return $this->loadedModules[$moduleReflection->getNamespaceName()]; + } + } + /* * Keep track of nested module loading using the $loadFinished * property. @@ -317,4 +333,21 @@ protected function attachDefaultListeners($events) { $events->attach(ModuleEvent::EVENT_LOAD_MODULES, [$this, 'onLoadModules']); } + + /** + * determines the class string of the module + * + * @param $moduleName + * @return string + */ + private function getVerifiedModuleName($moduleName) + { + $verifiedModulName = $moduleName; + + if (!class_exists($moduleName) && class_exists($moduleName.'\Module')) { + $verifiedModulName = $moduleName.'\Module'; + } + + return $verifiedModulName; + } } diff --git a/test/ModuleManagerTest.php b/test/ModuleManagerTest.php index d92dfc3..ec6d504 100644 --- a/test/ModuleManagerTest.php +++ b/test/ModuleManagerTest.php @@ -100,6 +100,38 @@ public function testModuleLoadingBehavior() self::assertSame(1, count($modules)); } + public function testModuleLoadingBehaviorWithModuleClassStrings() + { + $moduleManager = new ModuleManager(['SomeModule'], $this->events); + $this->defaultListeners->attach($this->events); + $modules = $moduleManager->getLoadedModules(); + self::assertSame(0, count($modules)); + $modules = $moduleManager->getLoadedModules(true); + self::assertSame(1, count($modules)); + + + $moduleManager->loadModules(); // should not cause any problems + $moduleManager->loadModule(\SomeModule\Module::class); // should not cause any problems + $modules = $moduleManager->getLoadedModules(true); // BarModule already loaded so nothing happens + self::assertSame(1, count($modules)); + } + + public function testModuleLoadingBehaviorWithModuleClassStringsVersion2() + { + $moduleManager = new ModuleManager([\SomeModule\Module::class], $this->events); + $this->defaultListeners->attach($this->events); + $modules = $moduleManager->getLoadedModules(); + self::assertSame(0, count($modules)); + $modules = $moduleManager->getLoadedModules(true); + self::assertSame(1, count($modules)); + + + $moduleManager->loadModules(); // should not cause any problems + $moduleManager->loadModule('SomeModule'); // should not cause any problems + $modules = $moduleManager->getLoadedModules(true); // BarModule already loaded so nothing happens + self::assertSame(1, count($modules)); + } + public function testConstructorThrowsInvalidArgumentException() { $this->expectException(InvalidArgumentException::class); From 4b9bcae0028374f03ff2c75f7016ea1bf77483bc Mon Sep 17 00:00:00 2001 From: Sebastian Hopfe Date: Fri, 8 Apr 2022 15:25:20 +0200 Subject: [PATCH 2/3] fix - loadModule reinitializes modules if the module has already been loaded #32 Signed-off-by: Sebastian Hopfe --- src/ModuleManager.php | 10 ++++++---- test/ModuleManagerTest.php | 4 ++-- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/ModuleManager.php b/src/ModuleManager.php index 39e6227..8709d9d 100644 --- a/src/ModuleManager.php +++ b/src/ModuleManager.php @@ -6,8 +6,10 @@ use Laminas\EventManager\EventManager; use Laminas\EventManager\EventManagerInterface; +use ReflectionClass; use Traversable; +use function class_exists; use function current; use function get_class; use function is_array; @@ -141,7 +143,7 @@ public function loadModule($module) // when no class-string is found, try search for a namespace if (class_exists($verifiedModulName)) { - $moduleReflection = new \ReflectionClass($verifiedModulName); + $moduleReflection = new ReflectionClass($verifiedModulName); if (isset($this->loadedModules[$moduleReflection->getNamespaceName()])) { return $this->loadedModules[$moduleReflection->getNamespaceName()]; @@ -337,15 +339,15 @@ protected function attachDefaultListeners($events) /** * determines the class string of the module * - * @param $moduleName + * @param string $moduleName * @return string */ private function getVerifiedModuleName($moduleName) { $verifiedModulName = $moduleName; - if (!class_exists($moduleName) && class_exists($moduleName.'\Module')) { - $verifiedModulName = $moduleName.'\Module'; + if (!class_exists($moduleName) && class_exists($moduleName . '\Module')) { + $verifiedModulName = $moduleName . '\Module'; } return $verifiedModulName; diff --git a/test/ModuleManagerTest.php b/test/ModuleManagerTest.php index ec6d504..f945de7 100644 --- a/test/ModuleManagerTest.php +++ b/test/ModuleManagerTest.php @@ -111,14 +111,14 @@ public function testModuleLoadingBehaviorWithModuleClassStrings() $moduleManager->loadModules(); // should not cause any problems - $moduleManager->loadModule(\SomeModule\Module::class); // should not cause any problems + $moduleManager->loadModule(Module::class); // should not cause any problems $modules = $moduleManager->getLoadedModules(true); // BarModule already loaded so nothing happens self::assertSame(1, count($modules)); } public function testModuleLoadingBehaviorWithModuleClassStringsVersion2() { - $moduleManager = new ModuleManager([\SomeModule\Module::class], $this->events); + $moduleManager = new ModuleManager([Module::class], $this->events); $this->defaultListeners->attach($this->events); $modules = $moduleManager->getLoadedModules(); self::assertSame(0, count($modules)); From ec684de4c5e1d27a40b9f59a98d7946b6191721f Mon Sep 17 00:00:00 2001 From: Sebastian Hopfe Date: Fri, 8 Apr 2022 15:28:53 +0200 Subject: [PATCH 3/3] solve code style issues Signed-off-by: Sebastian Hopfe --- src/ModuleManager.php | 2 +- test/ModuleManagerTest.php | 4 ---- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/src/ModuleManager.php b/src/ModuleManager.php index 8709d9d..34b5a4b 100644 --- a/src/ModuleManager.php +++ b/src/ModuleManager.php @@ -346,7 +346,7 @@ private function getVerifiedModuleName($moduleName) { $verifiedModulName = $moduleName; - if (!class_exists($moduleName) && class_exists($moduleName . '\Module')) { + if (! class_exists($moduleName) && class_exists($moduleName . '\Module')) { $verifiedModulName = $moduleName . '\Module'; } diff --git a/test/ModuleManagerTest.php b/test/ModuleManagerTest.php index f945de7..f5ef3b9 100644 --- a/test/ModuleManagerTest.php +++ b/test/ModuleManagerTest.php @@ -108,8 +108,6 @@ public function testModuleLoadingBehaviorWithModuleClassStrings() self::assertSame(0, count($modules)); $modules = $moduleManager->getLoadedModules(true); self::assertSame(1, count($modules)); - - $moduleManager->loadModules(); // should not cause any problems $moduleManager->loadModule(Module::class); // should not cause any problems $modules = $moduleManager->getLoadedModules(true); // BarModule already loaded so nothing happens @@ -124,8 +122,6 @@ public function testModuleLoadingBehaviorWithModuleClassStringsVersion2() self::assertSame(0, count($modules)); $modules = $moduleManager->getLoadedModules(true); self::assertSame(1, count($modules)); - - $moduleManager->loadModules(); // should not cause any problems $moduleManager->loadModule('SomeModule'); // should not cause any problems $modules = $moduleManager->getLoadedModules(true); // BarModule already loaded so nothing happens