From 821cb43c51f67d60c3f8221327ab6d8ca5940b75 Mon Sep 17 00:00:00 2001 From: Marcus Eibrink-Lunzenauer Date: Thu, 26 Jun 2025 13:04:56 +0000 Subject: Throw an exception when loading a plugin that is already loading. Closes #4317 Merge request studip/studip!3126 --- lib/exceptions/PluginAlreadyLoadingException.php | 19 +++++++++++++++++++ lib/plugins/engine/PluginEngine.php | 1 + lib/plugins/engine/PluginManager.php | 10 ++++++++-- 3 files changed, 28 insertions(+), 2 deletions(-) create mode 100644 lib/exceptions/PluginAlreadyLoadingException.php diff --git a/lib/exceptions/PluginAlreadyLoadingException.php b/lib/exceptions/PluginAlreadyLoadingException.php new file mode 100644 index 0000000..76fbce0 --- /dev/null +++ b/lib/exceptions/PluginAlreadyLoadingException.php @@ -0,0 +1,19 @@ +have_perm('admin')) { self::getPlugins(AdministrationPlugin::class); } + NotificationCenter::postNotification('PluginsDidLoad', PluginManager::getInstance()); } /** diff --git a/lib/plugins/engine/PluginManager.php b/lib/plugins/engine/PluginManager.php index 4bcb96b..3288382 100644 --- a/lib/plugins/engine/PluginManager.php +++ b/lib/plugins/engine/PluginManager.php @@ -594,16 +594,22 @@ class PluginManager $plugin_class = ''; $plugin = null; - if (isset($this->plugin_cache[$class])) { - return $this->plugin_cache[$class]; + if (array_key_exists($class, $this->plugin_cache)) { + if ($this->plugin_cache[$class] !== null) { + return $this->plugin_cache[$class]; + } + throw new PluginAlreadyLoadingException($class); } + $this->plugin_cache[$class] = null; + if ($plugin_info['core'] || !$this->isPluginsDisabled()) { $plugin_class = $this->loadPlugin($class, $path); } if ($plugin_class) { $plugin = app()->get($class); + NotificationCenter::postNotification('PluginDidLoad', $this, compact('class', 'plugin')); } return $this->plugin_cache[$class] = $plugin; -- cgit v1.0