diff --git a/src/Globals/global_class_alias.php b/src/Globals/global_class_alias.php index a20c0cb0..0989cb1e 100644 --- a/src/Globals/global_class_alias.php +++ b/src/Globals/global_class_alias.php @@ -2,20 +2,22 @@ declare(strict_types=1); -class_alias(\ZM\Annotation\Framework\BindEvent::class, 'BindEvent'); -class_alias(\ZM\Annotation\Framework\Init::class, 'Init'); -class_alias(\ZM\Annotation\Framework\Setup::class, 'Setup'); -class_alias(\ZM\Annotation\Http\Controller::class, 'Controller'); -class_alias(\ZM\Annotation\Http\Route::class, 'Route'); -class_alias(\ZM\Annotation\Middleware\Middleware::class, 'Middleware'); -class_alias(\ZM\Annotation\OneBot\BotCommand::class, 'BotCommand'); -class_alias(\ZM\Annotation\OneBot\BotEvent::class, 'BotEvent'); -class_alias(\ZM\Annotation\OneBot\CommandArgument::class, 'CommandArgument'); -class_alias(\ZM\Annotation\Closed::class, 'Closed'); -class_alias(\ZM\Plugin\ZMPlugin::class, 'ZMPlugin'); +use ZM\Container\ClassAliasHelper; + +ClassAliasHelper::addAlias(\ZM\Annotation\Framework\BindEvent::class, 'BindEvent'); +ClassAliasHelper::addAlias(\ZM\Annotation\Framework\Init::class, 'Init'); +ClassAliasHelper::addAlias(\ZM\Annotation\Framework\Setup::class, 'Setup'); +ClassAliasHelper::addAlias(\ZM\Annotation\Http\Controller::class, 'Controller'); +ClassAliasHelper::addAlias(\ZM\Annotation\Http\Route::class, 'Route'); +ClassAliasHelper::addAlias(\ZM\Annotation\Middleware\Middleware::class, 'Middleware'); +ClassAliasHelper::addAlias(\ZM\Annotation\OneBot\BotCommand::class, 'BotCommand'); +ClassAliasHelper::addAlias(\ZM\Annotation\OneBot\BotEvent::class, 'BotEvent'); +ClassAliasHelper::addAlias(\ZM\Annotation\OneBot\CommandArgument::class, 'CommandArgument'); +ClassAliasHelper::addAlias(\ZM\Annotation\Closed::class, 'Closed'); +ClassAliasHelper::addAlias(\ZM\Plugin\ZMPlugin::class, 'ZMPlugin'); // 下面是 OneBot 相关类的全局别称 -class_alias(\OneBot\Driver\Event\WebSocket\WebSocketOpenEvent::class, 'WebSocketOpenEvent'); -class_alias(\OneBot\Driver\Event\WebSocket\WebSocketCloseEvent::class, 'WebSocketCloseEvent'); -class_alias(\OneBot\Driver\Event\WebSocket\WebSocketMessageEvent::class, 'WebSocketMessageEvent'); -class_alias(\OneBot\Driver\Event\Http\HttpRequestEvent::class, 'HttpRequestEvent'); +ClassAliasHelper::addAlias(\OneBot\Driver\Event\WebSocket\WebSocketOpenEvent::class, 'WebSocketOpenEvent'); +ClassAliasHelper::addAlias(\OneBot\Driver\Event\WebSocket\WebSocketCloseEvent::class, 'WebSocketCloseEvent'); +ClassAliasHelper::addAlias(\OneBot\Driver\Event\WebSocket\WebSocketMessageEvent::class, 'WebSocketMessageEvent'); +ClassAliasHelper::addAlias(\OneBot\Driver\Event\Http\HttpRequestEvent::class, 'HttpRequestEvent'); diff --git a/src/ZM/Container/ClassAliasHelper.php b/src/ZM/Container/ClassAliasHelper.php new file mode 100644 index 00000000..ea986dca --- /dev/null +++ b/src/ZM/Container/ClassAliasHelper.php @@ -0,0 +1,76 @@ + $class, 'alias' => $alias]; + } + + /** + * 判断一个类是否是别名 + * + * @param string $alias 别名 + */ + public static function isAlias(string $alias): bool + { + return isset(self::$aliases[$alias]); + } + + /** + * 获取别名定义信息 + * + * @param string $alias 别名 + * @return null|array{class:string,alias:string} 如果没有定义则返回 null + */ + public static function getAlias(string $alias): ?array + { + return self::$aliases[$alias] ?? null; + } + + /** + * 根据类名获取别名 + * + * @param string $class 类名 + * @return null|array{class:string,alias:string} 如果没有定义则返回 null + */ + public static function getAliasByClass(string $class): ?array + { + foreach (self::$aliases as $alias) { + if ($alias['class'] === $class) { + return $alias; + } + } + return null; + } + + /** + * 根据别名获取类名 + * + * @param string $alias 别名 + * @return string 类名 + */ + public static function getClass(string $alias): string + { + return self::$aliases[$alias]['class'] ?? $alias; + } +} diff --git a/src/ZM/Container/ContainerTrait.php b/src/ZM/Container/ContainerTrait.php index f0c9ae82..a49c7729 100644 --- a/src/ZM/Container/ContainerTrait.php +++ b/src/ZM/Container/ContainerTrait.php @@ -76,6 +76,9 @@ trait ContainerTrait public function getAlias(string $abstract): string { if (!isset(self::$aliases[$abstract])) { + if (ClassAliasHelper::isAlias($abstract)) { + return $this->getAlias(ClassAliasHelper::getAlias($abstract)['class']); + } return $abstract; } @@ -439,7 +442,13 @@ trait ContainerTrait */ public function getLogPrefix(): string { - return ($this->log_prefix ?? '[WorkerContainer(U)]') . ' '; + $id = spl_object_id($this); + // 级联容器的日志前缀为父容器的日志前缀加上当前容器的id + if (method_exists($this, 'getParent')) { + $parent = $this->getParent(); + $id = spl_object_id($parent) . '-' . $id; + } + return "[Container {$id}] "; } /**