Brunt is a simple but powerful dependency injection framework. Since php7, reflection can be used to analyze constructors properly.
"require": {
"sysvyz/brunt": "1.0.*",
},
Unit tests in /test/
phpunit
php vendor/bin/phpunit
simply use composer dump-autoload
then include __DIR__ . '/vendor/autoload.php';
$injector = new Brunt\Injector(null);
/** @var Engine $engine */
$engine = $injector->get(Engine::class);
$engine = $injector->get(Engine::class);
//is equivalent to
$engine = $injector->{Engine::class};
$injector = new Injector(null);
// TOKEN PROVIDER CLASS
$injector->addProviders([Engine::class => ClassProvider::init(HeavyEngine::class)]);
/** @var Engine $engine */
$engine = $injector->get(Engine::class);
Bindings are a more convenient way to define Providers
$injector->bind([
bind('%SomeValue%')
->toValue(3.1415),
bind(Car::class)
->toClass(Car::class),
bind(Request::class)
->toFactory(function (Injector $injector) {
return Request::createFromGlobals();
})
])
Just call singleton()
and the provider always returns the same object.
$injector = new Injector(null);
// TOKEN PROVIDER CLASS SINGLETON
$injector->addProviders([Engine::class => ClassProvider::init(HeavyEngine::class)->singleton()]);
/** @var Engine $engine */
$engine = $injector->get(Engine::class);
or as binding
$injector = new Injector(null);
$injector->bind([
bind(Car::class)
->toClass(Car::class)->singleton(),
]);
$car = $injector->get(Car::class)
Just call lazy()
and the provider returns a proxy object the real object will be created on first use.
$injector = new Injector(null);
// TOKEN PROVIDER CLASS LAZY
$injector->addProviders([Engine::class => ClassProvider::init(HeavyEngine::class)->lazy()]);
/** @var Engine $engine */
$engine = $injector->get(Engine::class); //returns a proxy object
or as binding
$injector = new Injector(null);
$injector->bind([
bind(Car::class)
->toClass(Car::class)->lazy(),
]);
$car = $injector->get(Car::class) //returns a proxy object
$car->honk() //creates the actual car and honks
the proxy object inherits from the actual class, so it can be used as if it was the object it passes instanceof and function parameter type declarations
combine lazy and singleton (order doesn't matter)
bind(Car::class)->lazy()->singleton()
ClassProvider::init(Car::class)->lazy()->singleton();
... alias
$injector->addProviders([
HeavyEngine::class => ClassProvider::init(HeavyEngine::class)->lazy()
Engine::class => AliasProvider::init(HeavyEngine::class)
]);
$heavyEngine = $injector->get(Engine::class); //returns a proxy object for HeavyEngine
coming up...