ytake / hh-container
简单的轻量级服务定位/依赖注入容器
1.1.0
2018-10-07 17:51 UTC
Requires
- hhvm: >=3.28
- hhvm/hhvm-autoload: ^1.6
- hhvm/hsl: ^3.28
- ytake/psr-container-hhi: ^1.0
Requires (Dev)
- facebook/fbexpect: ^2.1.3
- hhvm/hacktest: ^1.0
- hhvm/hhast: >=3.28.0
This package is auto-updated.
Last update: 2024-08-23 06:34:42 UTC
README
HH-Container
简单的轻量级服务定位/依赖注入容器
安装
$ hhvm $(which composer) require ytake/hh-container
"require": { "hhvm": ">=3.24", "ytake/hh-container": "^1.0" },
用法
$container = new \Ytake\HHContainer\FactoryContainer(); $container->set('testing', $container ==> 'testing'); $container->get('testing'); // return string
单例或原型
默认 原型
单例
$container = new \Ytake\HHContainer\FactoryContainer(); $container->set('scope:singleton', $container ==> new \stdClass(), \Ytake\HHContainer\Scope::Singleton);
原型
$container = new \Ytake\HHContainer\FactoryContainer(); $container->set('scope:prototype', $container ==> new \stdClass(), \Ytake\HHContainer\Scope::Prototype);
依赖注入
设置参数
示例类
final class MessageClass { public function __construct( protected string $message ) {} public function message(): string { return $this->message; } } final class MessageClient { public function __construct( protected MessageClass $message ) {} public function message(): MessageClass { return $this->message; } }
注入
$container = new \Ytake\HHContainer\FactoryContainer(); $container->set('message.class', $container ==> new MessageClass('testing')); $container->set(MessageClient::class, $container ==> { $instance = $container->get('message.class'); invariant($instance instanceof MockMessageClass, 'error'); new MessageClient($instance); }); $instance = $container->get(MessageClient::class);
可调用
返回具有在调用时提供的参数的可调用值的值。
final class TestingInvokable { public function __invoke(FactoryContainer $container): int { return 1; } } $container = new \Ytake\HHContainer\FactoryContainer(); $container->set(TestingInvokable::class, $container ==> $container->callable( new \Ytake\HHContainer\Invokable( new TestingInvokable(), '__invoke', $container ) ) );
使用模块
use Ytake\HHContainer\ServiceModule; use Ytake\HHContainer\FactoryContainer; class ExampleModule extends ServiceModule { public function provide(FactoryContainer $container): void { $container->set('example', $container ==> new \stdClass()); } }
$container = new \Ytake\HHContainer\FactoryContainer(); $container->register(ExampleModule::class); $container->lockModule();
服务工厂
use Ytake\HHContainer\Scope; use Ytake\HHContainer\ServiceFactory; use Ytake\HHContainer\FactoryContainer; use Ytake\HHContainer\FactoryInterface; class StringFactory implements FactoryInterface { const type T = string; public function provide(FactoryContainer $_container): StringFactory::T { return 'testing'; } public function scope(): Scope { return Scope::Singleton; } public function name(): string { return 'testing' } } $factory = new ServiceFactory(new FactoryContainer()); $factory->registerFactory(new StringFactory()); $factory->create('testing');