ytake / hh-container
simple light weight service location / dependency injection container
Fund package maintenance!
ytake
Installs: 561
Dependents: 0
Suggesters: 0
Security: 0
Stars: 2
Watchers: 4
Forks: 0
Open Issues: 0
Language:Hack
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-10-23 06:51:01 UTC
README
HH-Container
simple light weight service location / dependency injection container
Installation
$ hhvm $(which composer) require ytake/hh-container
"require": { "hhvm": ">=3.24", "ytake/hh-container": "^1.0" },
Usage
$container = new \Ytake\HHContainer\FactoryContainer(); $container->set('testing', $container ==> 'testing'); $container->get('testing'); // return string
Singleton or Prototype
default prototype
SINGLETON
$container = new \Ytake\HHContainer\FactoryContainer(); $container->set('scope:singleton', $container ==> new \stdClass(), \Ytake\HHContainer\Scope::Singleton);
PROTOTYPE
$container = new \Ytake\HHContainer\FactoryContainer(); $container->set('scope:prototype', $container ==> new \stdClass(), \Ytake\HHContainer\Scope::Prototype);
Dependency Injection
set parameters
sample class
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; } }
Inject
$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);
callable
returns the value of a callable with parameters supplied at calltime.
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 modules
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();
Service Factory
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');