webapper / d3i
D3I(动态装饰器依赖注入)是Pimple的替代品
dev-master / 1.0.x-dev
2015-12-20 19:40 UTC
Requires
- php: >=5.4.0
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!"
您还可以使用“#”(井号)为数组的一个整数键添加注释。
贡献和法律信息
请自由贡献!