thruster/container

Thruster 容器组件

1.1.0 2016-05-31 15:41 UTC

This package is auto-updated.

Last update: 2024-09-14 02:40:54 UTC


README

[最新版本] (https://github.com/ThrusterIO/container/releases) [软件许可] (LICENSE) [构建状态] (https://travis-ci.org/ThrusterIO/container) [代码覆盖率] (https://scrutinizer-ci.com/g/ThrusterIO/container) [质量评分] (https://scrutinizer-ci.com/g/ThrusterIO/container) [总下载量] (https://packagist.org.cn/packages/thruster/container)

[电子邮件] (mailto:team@thruster.io)

Thruster 容器组件。容器是一个小巧的自包含依赖注入容器,实现了 ContainerInterface 接口。

安装

通过 Composer

$ composer require thruster/container

用法

只需创建一个 Container 实例

<?php

use Thruster\Component\Container;

$container = new Container();

您还可以将预置值数组传递给构造函数。

<?php

use Thruster\Component\Container;

$values = [
	'render.engine' => function ($container) {
		return new RenderEngine($container->get('translation.engine'));
	},
	'translation.engine' => function () {
		return new TranslationEngine();
	}
];

$container = new Container($values);

容器提供了一组简单的命名函数来使用容器:has、set、get、remove

<?php

use Thruster\Component\Container;

$container = new Container();

$container->has('render.engine'); // = false
$container->set('render.engine', function ($container) {
		return new RenderEngine($container->get('translation.engine'));
});

$container->has('render.engine'); // = true

$renderEngine = $container->get('render.engine');

$container->remove('render.engine');
$container->has('render.engine'); // = false

容器还支持 \ArrayAccess

<?php

use Thruster\Component\Container;

$container = new Container();

isset($container['render.engine']); // = false
$container['render.engine'] = function ($container) {
		return new RenderEngine($container->get('translation.engine'));
};

isset($container['render.engine']); // = true

$renderEngine = $container['render.engine'];

unset($container['render.engine']);
isset($container['render.engine']); // = false

默认情况下,容器始终返回相同标识符的同一实例,但您可以创建一个工厂定义,该定义将始终返回新实例的标识符。

<?php

use Thruster\Component\Container;

$container = new Container();

$i = 1;

$value = function () use ($i) {
	return $i++;
}

$factoryValue = function () use (&$i) {
	return $i++;
}

$container->set('normal', $value);

$container->get('normal'); // = 1
$container->get('normal'); // = 1

$container->set('factory', $factoryValue);

$container->get('factory'); // = 1
$container->get('factory'); // = 2

容器提供了通过 ContainerProviderInterface 扩展容器的方式

<?php

use Thruster\Component\Container;
use Thruster\Component\ContainerProviderInterface;

$container = new Container();

$provider = new class implements ContainerProviderInterface {
	public function register(Container $container)
	{
		$container->set(....);
	}
};

$container->addProvider($provider);

错误

  • 如果标识符在容器中未找到,容器将抛出 NotFoundException
  • 当尝试为已冻结的标识符设置定义时,容器将抛出 IdentifierFrozenException。(冻结表示值已使用过一次)

测试

$ composer test

贡献

请参阅贡献指南行为准则以获取详细信息。

许可证

有关更多信息,请参阅许可证文件