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()); } }