D3I(动态装饰器依赖注入)是Pimple的替代品

dev-master / 1.0.x-dev 2015-12-20 19:40 UTC

This package is not auto-updated.

Last update: 2024-09-14 17:32:13 UTC


README

D3I(动态装饰器依赖注入)是Pimple的替代品,我建议用于类似Silex的框架。

主要定义

容器

容器对象用于保存服务和其它值(例如配置设置值)。您可以通过属性访问(箭头风格:->key)和数组项访问(括号风格:[key])来访问所有值。

当您以属性的方式访问一个项目并且它是一个Provider时,Provider将被调用,并且您将提供其服务

$container = new Container();
$container->my_service = Provider::Create(function(Container $c) {...return $service;})->share(); // registering a service
$service = $container->my_service; // getting the unique instance of the "my_service" service

Provider

这是用于封装要注册的服务。您可以通过这个类获取、共享、保护或扩展一个服务。

获取服务

$service = $provider($container);

共享服务

$provider->share();

保护服务将在从容器获取服务时始终返回一个新实例的服务

$provider->protect();

扩展服务

$extendedProvider = $provider->extend(function(Container $c, $s) {
	// ...using of parent container
	$foo = $c['foo'] + 1;
	// ...using of parent service
	$s->setFoo($foo);
	return $s;
});

...或使用Provider扩展

$container->my_extension = Provider::Create(function(Container $c, $s=null) {
	// checking whether if extending a service or not:
	if ($s === null) return new Service(); // returning a simple service rather than extending it

	// ...using of parent container
	$foo = $c['foo'] + 1;
	// ...using of parent service
	$s->setFoo($foo);
	return $s; // returns the extended service
})->share();
...
$extendedProvider = $container['my_service']->extend($container['my_extension']);

这种扩展方式非常有用,当您想将扩展作为独立的服务使用时。

查询解析器

D3I使用一种特殊的访问风格,我们称之为D3I查询。您可以通过属性和数组访问来使用它,但我们建议只使用数组访问。

通过D3I查询,您可以使用单行查询作为容器键来访问子项,而无需逐级访问。当您想在设置中引用服务或设置并快速访问引用的项时非常有用。

例如,假设我们有一个配置设置,基于设置创建一个服务,并使用D3I查询访问设置

$container = Container::Create([
	'my_service'	=> [
		'settings'	=> [
			'welcome_str' => 'Hello %s!'
		]
	]
]);

class MyService {
	public $settings;
	function __construct($settings) {
		$this->settings = $settings;
	}
	function getWelcome($to = 'World') {
		// getting the welcome_str property by querying service
		return sprintf($container['@my_service.settings.welcome_str'], $to);
	}
}

$container->my_service = Provider::Create(function(Container $c) {
	// getting original settings by accessing the mutated original value of this provider
	return new MyService($c['!my_service.settings']);
})
	->mutate($container['my_service']) // mutate the original value before of overlapping it
	->share();

echo $container->my_service->getWelcome();
// -> "Hello World!"

您还可以使用“#”(井号)为数组的一个整数键添加注释。

贡献和法律信息

请自由贡献!

为该项目选择的许可证是WTFPL,因此查看它以了解条件。谢谢!