webman后台

This commit is contained in:
2026-03-07 19:42:22 +08:00
parent 9ed4c1bc58
commit 83725aef88
181 changed files with 19115 additions and 1 deletions

View File

@@ -0,0 +1,96 @@
<?php
declare(strict_types=1);
namespace support\bootstrap;
use Workerman\Worker;
/**
* 模块加载引导:迁移自 app\common\service\moduleService
* 在 webman 启动时加载已启用模块的 AppInit 逻辑
*/
class ModuleInit implements \Webman\Bootstrap
{
public static function start(?Worker $worker): void
{
$modulesDir = rtrim(base_path(), DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR . 'modules' . DIRECTORY_SEPARATOR;
if (!is_dir($modulesDir)) {
return;
}
$installed = self::installedList($modulesDir);
foreach ($installed as $item) {
if (($item['state'] ?? 0) != 1) {
continue;
}
$uid = $item['uid'] ?? '';
if (!$uid) {
continue;
}
$moduleClass = self::getModuleEventClass($uid);
if ($moduleClass && class_exists($moduleClass) && method_exists($moduleClass, 'AppInit')) {
try {
$handle = new $moduleClass();
$handle->AppInit();
} catch (\Throwable $e) {
// 模块 AppInit 异常不阻断启动,仅记录
if (class_exists(\support\Log::class)) {
\support\Log::warning('[ModuleInit] ' . $uid . ': ' . $e->getMessage());
}
}
}
}
}
/**
* 获取已安装模块列表(与 Server::installedList 逻辑一致)
*/
protected static function installedList(string $dir): array
{
$installedDir = @scandir($dir);
if ($installedDir === false) {
return [];
}
$installedList = [];
foreach ($installedDir as $item) {
if ($item === '.' || $item === '..' || is_file($dir . $item)) {
continue;
}
$tempDir = $dir . $item . DIRECTORY_SEPARATOR;
if (!is_dir($tempDir)) {
continue;
}
$info = self::getIni($tempDir);
if (!isset($info['uid'])) {
continue;
}
$installedList[] = $info;
}
return $installedList;
}
/**
* 读取模块 info.ini
*/
protected static function getIni(string $dir): array
{
$infoFile = $dir . 'info.ini';
if (!is_file($infoFile)) {
return [];
}
$info = @parse_ini_file($infoFile, true, INI_SCANNER_TYPED);
return is_array($info) ? $info : [];
}
/**
* 获取模块 Event 类命名空间(与 Server::getClass 逻辑一致)
*/
protected static function getModuleEventClass(string $uid): ?string
{
$name = function_exists('parse_name') ? parse_name($uid) : str_replace('-', '_', $uid);
$class = function_exists('parse_name') ? parse_name($name, 1) : ucfirst(str_replace('_', '', ucwords($name, '_')));
$namespace = '\\modules\\' . $name . '\\' . $class;
return class_exists($namespace) ? $namespace : null;
}
}