add container class_alias support (#189)

This commit is contained in:
sunxyw 2022-12-20 23:04:26 +08:00 committed by GitHub
parent 588fc919d9
commit b2a6c2f5e0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 103 additions and 16 deletions

View File

@ -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');

View File

@ -0,0 +1,76 @@
<?php
declare(strict_types=1);
namespace ZM\Container;
/**
* 旨在帮助识别 class_alias 定义的类别名
*/
class ClassAliasHelper
{
/**
* @var array{class:string,alias:string}[]
*/
private static array $aliases = [];
/**
* 添加一个类别名
*
* @param string $class 类名
* @param string $alias 别名
*/
public static function addAlias(string $class, string $alias): void
{
class_alias($class, $alias);
self::$aliases[$alias] = ['class' => $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;
}
}

View File

@ -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}] ";
}
/**