diff --git a/app/Config/ViewComponents.php b/app/Config/ViewComponents.php new file mode 100644 index 00000000..25afea84 --- /dev/null +++ b/app/Config/ViewComponents.php @@ -0,0 +1,22 @@ + + */ + public array $lookupModules = [ + APP_NAMESPACE => APPPATH, + 'Modules\Admin' => ROOTPATH . 'modules/Admin/', + 'Modules\Auth' => ROOTPATH . 'modules/Auth/', + 'Modules\Analytics' => ROOTPATH . 'modules/Analytics/', + 'Modules\Install' => ROOTPATH . 'modules/Install/', + 'Modules\Fediverse' => ROOTPATH . 'modules/Fediverse/', + ]; +} diff --git a/app/Libraries/ViewComponents/ComponentRenderer.php b/app/Libraries/ViewComponents/ComponentRenderer.php index c20d9d44..38a8e9ec 100644 --- a/app/Libraries/ViewComponents/ComponentRenderer.php +++ b/app/Libraries/ViewComponents/ComponentRenderer.php @@ -137,12 +137,13 @@ class ComponentRenderer private function locateView(string $name): string { // TODO: Is there a better way to locate components local to current module? - $modulesToDiscover = [APPPATH]; - foreach (config('Autoload')->psr4 as $namespace => $path) { - if (str_starts_with($this->currentView, $namespace)) { - array_unshift($modulesToDiscover, $path); - } - } + $modulesToDiscover = []; + $lookupModules = $this->config->lookupModules; + $modulesToDiscover = array_filter($lookupModules, function ($namespace): bool { + return str_starts_with($this->currentView, $namespace); + }, ARRAY_FILTER_USE_KEY); + $modulesToDiscover = array_values($modulesToDiscover); + $modulesToDiscover[] = $this->config->defaultLookupPath; $namePath = str_replace('.', '/', $name); diff --git a/app/Libraries/ViewComponents/Config/ViewComponents.php b/app/Libraries/ViewComponents/Config/ViewComponents.php index efd45995..56c041fb 100644 --- a/app/Libraries/ViewComponents/Config/ViewComponents.php +++ b/app/Libraries/ViewComponents/Config/ViewComponents.php @@ -11,4 +11,14 @@ class ViewComponents extends BaseConfig public string $classComponentsPath = 'View/Components'; public string $viewFileComponentsPath = 'Views/components'; + + /** + * Modules to look into for local components. Associative array with the module namespace as key and the module path + * as value. + * + * @var array + */ + public array $lookupModules = []; + + public string $defaultLookupPath = APPPATH; }