From ea7d43172ad30450f56826716496b4b4d2ef9f9b Mon Sep 17 00:00:00 2001 From: Hugo Sales Date: Mon, 3 Aug 2020 20:52:47 +0000 Subject: [PATCH] [MODULE][COMPILER] Add compiler pass responsible for loading, instantiating and wiring enabled modules --- .../Compiler/ModuleManagerPass.php | 58 +++++++++++++++++++ src/Kernel.php | 2 + 2 files changed, 60 insertions(+) create mode 100644 src/DependencyInjection/Compiler/ModuleManagerPass.php diff --git a/src/DependencyInjection/Compiler/ModuleManagerPass.php b/src/DependencyInjection/Compiler/ModuleManagerPass.php new file mode 100644 index 0000000000..a071484990 --- /dev/null +++ b/src/DependencyInjection/Compiler/ModuleManagerPass.php @@ -0,0 +1,58 @@ +. +// }}} + +/** + * Module and plugin loader code, one of the main features of GNU social + * + * Loads plugins from `plugins/enabled`, instances them + * and hooks its events + * + * @package GNUsocial + * @category Modules + * + * @author Hugo Sales + * @copyright 2020 Free Software Foundation, Inc http://www.fsf.org + * @license https://www.gnu.org/licenses/agpl.html GNU AGPL v3 or later + */ + +namespace App\DependencyInjection\Compiler; + +use App\Core\ModuleManager; +use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; +use Symfony\Component\DependencyInjection\ContainerBuilder; + +class ModuleManagerPass implements CompilerPassInterface +{ + public function process(ContainerBuilder $container) + { + $module_paths = array_merge(glob(INSTALLDIR . '/components/*/*.php'), glob(INSTALLDIR . '/plugins/*/*.php')); + $module_manager = new ModuleManager(); + foreach ($module_paths as $path) { + // 'modules' and 'plugins' have the same length + $type = ucfirst(preg_replace('%' . INSTALLDIR . '/(component|plugin)s/.*%', '\1', $path)); + $module = basename(dirname($path)); + $fqcn = "\\{$type}\\{$module}\\{$module}"; + $module_manager->add($fqcn, $path); + } + + $module_manager->preRegisterEvents(); + + file_put_contents(INSTALLDIR . '/var/cache/module_manager.php', "addCompilerPass(new SchemaDefPass()); + $container->addCompilerPass(new ModuleManagerPass()); } }