improve class loading
This commit is contained in:
@@ -2,6 +2,8 @@
|
||||
|
||||
namespace KTXC\Module;
|
||||
|
||||
use KTXC\Server;
|
||||
|
||||
/**
|
||||
* Custom autoloader for modules that allows PascalCase namespaces
|
||||
* with lowercase folder names.
|
||||
@@ -70,6 +72,17 @@ class ModuleAutoloader
|
||||
}
|
||||
}
|
||||
|
||||
// Register module namespaces with Composer ClassLoader
|
||||
$composerLoader = Server::getComposerLoader();
|
||||
if ($composerLoader !== null) {
|
||||
foreach ($this->namespaceMap as $namespace => $folderName) {
|
||||
$composerLoader->addPsr4(
|
||||
'KTXM\\' . $namespace . '\\',
|
||||
$this->modulesRoot . '/' . $folderName . '/lib/'
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
$this->scanned = true;
|
||||
}
|
||||
|
||||
|
||||
@@ -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