improve class loading
This commit is contained in:
@@ -331,6 +331,9 @@ class ModuleManager
|
||||
|
||||
public function moduleInstance(string $handle, ?string $namespace = null): ?ModuleInstanceInterface
|
||||
{
|
||||
// Load module's vendor autoloader if it exists
|
||||
$this->loadModuleVendor($handle);
|
||||
|
||||
// Return from cache if already instantiated
|
||||
if (isset($this->moduleInstances[$handle])) {
|
||||
return $this->moduleInstances[$handle];
|
||||
@@ -429,6 +432,37 @@ class ModuleManager
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Load a module's vendor autoloader if it has dependencies
|
||||
*
|
||||
* @param string $handle Module handle
|
||||
* @throws Exception If module has dependencies but vendor directory is missing
|
||||
*/
|
||||
private function loadModuleVendor(string $handle): void
|
||||
{
|
||||
$moduleDir = $this->serverRoot . '/modules/' . $handle;
|
||||
$composerJson = $moduleDir . '/composer.json';
|
||||
$vendorAutoload = $moduleDir . '/lib/vendor/autoload.php';
|
||||
|
||||
// Check if module has a composer.json with dependencies
|
||||
if (file_exists($composerJson)) {
|
||||
$composerData = json_decode(file_get_contents($composerJson), true);
|
||||
$hasDependencies = !empty($composerData['require']) && count($composerData['require']) > 1; // More than just PHP
|
||||
|
||||
if ($hasDependencies) {
|
||||
if (file_exists($vendorAutoload)) {
|
||||
require_once $vendorAutoload;
|
||||
$this->logger->debug("Loaded vendor autoloader for module: {$handle}");
|
||||
} else {
|
||||
throw new Exception(
|
||||
"Module '{$handle}' declares dependencies in composer.json but vendor directory is missing. "
|
||||
. "Run 'composer install' in {$moduleDir}"
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private function studly(string $value): string
|
||||
{
|
||||
$value = str_replace(['-', '_'], ' ', strtolower($value));
|
||||
|
||||
Reference in New Issue
Block a user