mirror of
https://github.com/zhamao-robot/zhamao-framework.git
synced 2026-07-21 23:55:35 +08:00
add class alias support
This commit is contained in:
@@ -1,34 +0,0 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace ZM\Container;
|
||||
|
||||
use DI\Definition\Definition;
|
||||
use DI\Definition\Source\DefinitionSource;
|
||||
|
||||
class AliasBasedAutowiring implements DefinitionSource
|
||||
{
|
||||
private DefinitionSource $source;
|
||||
|
||||
public function __construct(DefinitionSource $source)
|
||||
{
|
||||
$this->source = $source;
|
||||
}
|
||||
|
||||
public function getDefinition(string $name): ?Definition
|
||||
{
|
||||
// 如果是别名,使用类名获取定义
|
||||
if (ClassAliasHelper::isAlias($name)) {
|
||||
$class = ClassAliasHelper::getAlias($name);
|
||||
} else {
|
||||
$class = $name;
|
||||
}
|
||||
return $this->source->getDefinition($class);
|
||||
}
|
||||
|
||||
public function getDefinitions(): array
|
||||
{
|
||||
return $this->source->getDefinitions();
|
||||
}
|
||||
}
|
||||
27
src/ZM/Container/AliasDefinitionSource.php
Normal file
27
src/ZM/Container/AliasDefinitionSource.php
Normal file
@@ -0,0 +1,27 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace ZM\Container;
|
||||
|
||||
use DI\Definition\Definition;
|
||||
use DI\Definition\Reference;
|
||||
use DI\Definition\Source\DefinitionSource;
|
||||
|
||||
class AliasDefinitionSource implements DefinitionSource
|
||||
{
|
||||
public function getDefinition(string $name): ?Definition
|
||||
{
|
||||
if (!class_exists($name)) {
|
||||
return null;
|
||||
}
|
||||
$ref = (new \ReflectionClass($name))->getName();
|
||||
// 如果反射类名和类名不一致,说明是别名,使用类名获取定义
|
||||
return $ref === $name ? null : new Reference($ref);
|
||||
}
|
||||
|
||||
public function getDefinitions(): array
|
||||
{
|
||||
return [];
|
||||
}
|
||||
}
|
||||
@@ -1,79 +0,0 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace ZM\Container;
|
||||
|
||||
/**
|
||||
* 旨在帮助识别 class_alias 定义的类别名
|
||||
*/
|
||||
class ClassAliasHelper
|
||||
{
|
||||
/**
|
||||
* @var array<string, class-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;
|
||||
}
|
||||
|
||||
/**
|
||||
* 判断一个类是否是别名
|
||||
*
|
||||
* @param string $alias 别名
|
||||
*/
|
||||
public static function isAlias(string $alias): bool
|
||||
{
|
||||
return isset(self::$aliases[$alias]);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取别名定义信息
|
||||
*
|
||||
* @param string $alias 别名
|
||||
* @return null|class-string 如果没有定义则返回 null
|
||||
*/
|
||||
public static function getAlias(string $alias): ?string
|
||||
{
|
||||
return self::$aliases[$alias] ?? null;
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据类名获取别名
|
||||
*
|
||||
* @param string $class 类名
|
||||
* @return null|class-string 如果没有定义则返回 null
|
||||
*/
|
||||
public static function getAliasByClass(string $class): ?string
|
||||
{
|
||||
return array_search($class, self::$aliases, true) ?: null;
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据别名获取类名
|
||||
*
|
||||
* @param string $alias 别名
|
||||
* @return string 类名
|
||||
*/
|
||||
public static function getClass(string $alias): string
|
||||
{
|
||||
return self::$aliases[$alias] ?? $alias;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取所有别名定义信息
|
||||
*/
|
||||
public static function getAllAlias(): array
|
||||
{
|
||||
return self::$aliases;
|
||||
}
|
||||
}
|
||||
@@ -28,13 +28,12 @@ class ContainerHolder
|
||||
private static function buildContainer(): Container
|
||||
{
|
||||
$builder = new ContainerBuilder();
|
||||
$sources = [
|
||||
new DI\Definition\Source\ReflectionBasedAutowiring(),
|
||||
new DI\Definition\Source\AttributeBasedAutowiring(),
|
||||
$builder->addDefinitions(
|
||||
new AliasDefinitionSource(),
|
||||
new DI\Definition\Source\DefinitionArray(config('container.definitions', [])),
|
||||
];
|
||||
$source = new DI\Definition\Source\SourceChain($sources);
|
||||
$builder->addDefinitions(new AliasBasedAutowiring($source));
|
||||
);
|
||||
$builder->useAutowiring(true);
|
||||
$builder->useAttributes(true);
|
||||
return $builder->build();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user