From 3f0fe292a39a68239b86c306841b629f58102a47 Mon Sep 17 00:00:00 2001 From: Luke Towers Date: Wed, 2 Mar 2022 21:12:25 -0600 Subject: [PATCH 1/2] Explicitly register module and plugin autoloading Initial work on revising the ClassLoader logic to use registered packages instead of directory scanning. Requires matching branch in winter/storm. --- modules/backend/ServiceProvider.php | 2 ++ modules/cms/ServiceProvider.php | 2 ++ modules/system/ServiceProvider.php | 11 ++++++++++- modules/system/classes/PluginManager.php | 6 +++++- modules/system/providers.php | 3 +++ 5 files changed, 22 insertions(+), 2 deletions(-) diff --git a/modules/backend/ServiceProvider.php b/modules/backend/ServiceProvider.php index 7c2549eca8..6f13c796ad 100644 --- a/modules/backend/ServiceProvider.php +++ b/modules/backend/ServiceProvider.php @@ -20,6 +20,8 @@ class ServiceProvider extends ModuleServiceProvider */ public function register() { + parent::register(); + $this->registerConsole(); $this->registerMailer(); $this->registerAssetBundles(); diff --git a/modules/cms/ServiceProvider.php b/modules/cms/ServiceProvider.php index 846a7b790c..d35a4c1176 100644 --- a/modules/cms/ServiceProvider.php +++ b/modules/cms/ServiceProvider.php @@ -36,6 +36,8 @@ class ServiceProvider extends ModuleServiceProvider */ public function register() { + parent::register(); + $this->registerConsole(); $this->registerTwigParser(); $this->registerAssetBundles(); diff --git a/modules/system/ServiceProvider.php b/modules/system/ServiceProvider.php index 53f85a1899..d4d1b6c9af 100644 --- a/modules/system/ServiceProvider.php +++ b/modules/system/ServiceProvider.php @@ -38,6 +38,8 @@ class ServiceProvider extends ModuleServiceProvider */ public function register() { + parent::register(); + $this->registerSingletons(); $this->registerPrivilegedActions(); @@ -60,7 +62,14 @@ public function register() * Register other module providers */ foreach (Config::get('cms.loadModules', []) as $module) { - if (strtolower(trim($module)) != 'system') { + $moduleLower = strtolower(trim($module)); + $serviceProviderPath = base_path("modules/$moduleLower/ServiceProvider.php"); + if ( + strtolower(trim($module)) !== 'system' + && file_exists($serviceProviderPath) + ) { + // Load and register the module's ServiceProvider + require_once $serviceProviderPath; App::register('\\' . $module . '\ServiceProvider'); } } diff --git a/modules/system/classes/PluginManager.php b/modules/system/classes/PluginManager.php index 6ca9d0a65b..042f96c7c1 100644 --- a/modules/system/classes/PluginManager.php +++ b/modules/system/classes/PluginManager.php @@ -177,6 +177,10 @@ public function loadPlugin($namespace, $path) $classObj->disabled = true; } + // Register the plugin with the autoloader + $pluginNamespace = Str::before(get_class($classObj), '\\Plugin') . '\\'; + $this->app->make(ClassLoader::class)->autoloadPackage($pluginNamespace, $path . '/'); + $this->plugins[$classId] = $classObj; $this->pathMap[$classId] = $path; $this->normalizedMap[strtolower($classId)] = $classId; @@ -292,7 +296,7 @@ public function registerPlugin($plugin, $pluginId = null) foreach ($replaces as $replace) { $replaceNamespace = $this->getNamespace($replace); - App::make(ClassLoader::class)->addNamespaceAliases([ + $this->app->make(ClassLoader::class)->addNamespaceAliases([ // class_alias() expects order to be $real, $alias $this->getNamespace($pluginId) => $replaceNamespace, ]); diff --git a/modules/system/providers.php b/modules/system/providers.php index 9fb16b4893..150ce21ae6 100644 --- a/modules/system/providers.php +++ b/modules/system/providers.php @@ -1,5 +1,8 @@ Date: Tue, 8 Mar 2022 19:43:55 -0600 Subject: [PATCH 2/2] Remove explicit class loader interactions from the test suite Should be handled by the ModuleServiceProvider & the PluginManager now. --- tests/bootstrap.php | 4 ---- 1 file changed, 4 deletions(-) diff --git a/tests/bootstrap.php b/tests/bootstrap.php index 6e1d5a9fd5..3b10dfa019 100644 --- a/tests/bootstrap.php +++ b/tests/bootstrap.php @@ -15,7 +15,3 @@ ); $loader->register(); -$loader->addDirectories([ - 'modules', - 'plugins' -]);