goez / di
Goez Dependency Injection Container
Installs: 61 835
Dependents: 0
Suggesters: 0
Security: 0
Stars: 5
Watchers: 1
Forks: 0
Open Issues: 0
Requires
- php: >= 8.0
Requires (Dev)
- orchestra/testbench: ^7.0
- phpunit/phpunit: ^9.0
- sempro/phpunit-pretty-print: ^1.2
README
A simple dependency injection container which was inspired by Laravel Service Container.
Features
- Nested dependency injection.
- Interface binding.
TODO
- Method injection
Installation
$ composer require goez/di
Usage
Initialize
use Goez\Di\Container; $container = Container::createInstance();
make($name[, $arguments])
Make an instance:
class App { private $appName; public function __construct($appName = 'ThisApp') { $this->appName = $appName; } public function getAppName() { return $this->appName; } } $app = $container->make(App::class); echo $app->getAppName(); // ThisApp $app = $container->make(App::class, ['MyApp']); echo $app->getAppName(); // MyApp
Inject object by type-hint:
class App { private $auth; private $appName; public function __construct(Auth $auth, $appName = 'ThisApp') { $this->auth = $auth; $this->appName = $appName; } } class Auth {} $app = $container->make(App::class);
Nested dependency injection:
class App { private $auth; private $appName; public function __construct(Auth $auth, $appName = 'ThisApp') { $this->auth = $auth; $this->appName = $appName; } } class Auth { private $db; public function __construct(Db $db) { $this->db = $db; } } $app = $container->make(App::class);
bind($name, $className|$closure)
Binding by key:
$container->bind('db', function ($container) { return new Db(); }); $db = $container->make('db');
Binding by interface:
interface DbInterface {} class Db implements DbInterface {} $container->bind(DbInterface::class, Db::class); $db = $container->make(DbInterface::class);
instance($name, $instance)
Bind an existed instance.
interface DbInterface {} class Db implements DbInterface {} $container->instance(DbInterface::class, new Db()); $db1 = $container->make(DbInterface::class); $container->instance(DbInterface::class, new Db()); $db2 = $container->make(DbInterface::class); assert($db1 !== $db2); // true
singleton($name, $instance|$closure)
Create singleton instance by closure.
interface DbInterface {} class Db implements DbInterface {} $container->singleton(DbInterface::class, function (Container $c) { return $c->make(Db::class); // Or return new Db(); }); $db1 = $container->make(DbInterface::class); $db2 = $container->make(DbInterface::class); assert($db1 === $db2);
Create singleton instance by an existed instance.
interface DbInterface {} class Db implements DbInterface {} $container->singleton(DbInterface::class, new Db()); $db1 = $container->make(DbInterface::class); $db2 = $container->make(DbInterface::class); assert($db1 === $db2);
License
MIT