Skip to content

Commit

Permalink
添加 alias
Browse files Browse the repository at this point in the history
  • Loading branch information
ueaner committed May 15, 2018
1 parent edcb563 commit 6ffb1d1
Show file tree
Hide file tree
Showing 3 changed files with 95 additions and 1 deletion.
40 changes: 39 additions & 1 deletion src/Di/Container.php
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,13 @@ class Container implements ContainerInterface, \ArrayAccess
*/
protected $sharedInstances = [];

/**
* 别名列表
*
* @var array
*/
public $aliases = [];

/**
* 初始化容器默认实例
*/
Expand Down Expand Up @@ -65,6 +72,8 @@ public static function instance()
*/
public function set($id, $definition, $shared = true)
{
unset($this->sharedInstances[$id], $this->aliases[$id]);

$service = new Service($id, $definition, $shared);
$this->services[$id] = $service;
return $service;
Expand All @@ -81,6 +90,8 @@ public function set($id, $definition, $shared = true)
*/
public function get($id, array $parameters = [])
{
$id = $this->getAlias($id);

// 如果是共享实例已解析,则返回
if (isset($this->sharedInstances[$id])) {
return $this->sharedInstances[$id];
Expand Down Expand Up @@ -112,6 +123,31 @@ public function get($id, array $parameters = [])
return $instance;
}

/**
* 为服务添加别名
*
* @param string $alias
* @param string $abstract
* @return void
*/
public function alias($alias, $abstract)
{
$this->aliases[$abstract] = $alias;
}

public function getAlias($abstract)
{
if (!isset($this->aliases[$abstract])) {
return $abstract;
}

if ($this->aliases[$abstract] === $abstract) {
throw new \LogicException("[{$abstract}] is aliased to itself.");
}

return $this->getAlias($this->aliases[$abstract]);
}

/**
* 查询容器中是否存在某个服务
*
Expand All @@ -120,7 +156,7 @@ public function get($id, array $parameters = [])
*/
public function has($id)
{
return isset($this->services[$id]);
return isset($this->services[$id]) || isset($this->aliases[$id]);
}

/**
Expand All @@ -133,6 +169,7 @@ public function remove($id)
{
unset($this->services[$id]);
unset($this->sharedInstances[$id]);
unset($this->aliases[$id]);
}

/**
Expand All @@ -144,6 +181,7 @@ public function clear()
{
$this->services = [];
$this->sharedInstances = [];
$this->aliases = [];
}

// 实现 \ArrayAccess 方法
Expand Down
9 changes: 9 additions & 0 deletions src/Di/ContainerInterface.php
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,15 @@ public function set($id, $definition, $shared);
*/
public function get($id);

/**
* 为服务添加别名
*
* @param string $alias
* @param string $abstract
* @return void
*/
public function alias($alias, $abstract);

/**
* 查询容器中是否存在某个服务
*
Expand Down
47 changes: 47 additions & 0 deletions tests/Di/ContainerTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -219,4 +219,51 @@ public function testCannotResolved()
{
$this->container->get('notExistsService');
}

public function testAlias()
{
$aliases = [
'app' => [
\Soli\Application::class,
],
'container' => [
\Soli\Di\Container::class,
\Psr\Container\ContainerInterface::class,
],
'one' => [
'two',
],
'two' => [
'three',
],
];

$container = $this->container;
foreach ($aliases as $alias => $abstracts) {
foreach ($abstracts as $abstract) {
$container->alias($alias, $abstract);
}
}

$containerAlias = $container->getAlias(\Psr\Container\ContainerInterface::class);
$oneAlias = $container->getAlias('three');

$this->assertEquals('container', $containerAlias);
$this->assertEquals('one', $oneAlias);
}

/**
* @expectedException \Exception
* @expectedExceptionMessageRegExp /.+ is aliased to itself./
*/
public function testAliasedItselfException()
{
$selfAlias = 'self_alias';

$container = $this->container;

$container->alias($selfAlias, $selfAlias);

$container->getAlias($selfAlias);
}
}

0 comments on commit 6ffb1d1

Please sign in to comment.