goez / di
Goez 依赖注入容器
2.0.0
2022-06-10 03:35 UTC
Requires
- php: >= 8.0
Requires (Dev)
- orchestra/testbench: ^7.0
- phpunit/phpunit: ^9.0
- sempro/phpunit-pretty-print: ^1.2
README
一个简单的依赖注入容器,灵感来源于 Laravel 服务容器。
特性
- 嵌套依赖注入。
- 接口绑定。
待办事项
- 方法注入
安装
$ composer require goez/di
用法
初始化
use Goez\Di\Container; $container = Container::createInstance();
make($name[, $arguments])
创建实例
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
通过类型提示注入对象
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);
嵌套依赖注入
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)
通过键绑定
$container->bind('db', function ($container) { return new Db(); }); $db = $container->make('db');
通过接口绑定
interface DbInterface {} class Db implements DbInterface {} $container->bind(DbInterface::class, Db::class); $db = $container->make(DbInterface::class);
instance($name, $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)
通过闭包创建单例实例
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);
通过现有实例创建单例实例
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);
许可
MIT