mdarc / di
一个简单而强大的PSR-11自动注入依赖注入容器
v1.0.4
2020-02-16 08:18 UTC
Requires
- php: >=7.1.0
- ext-reflection: *
- psr/container: ^1.0
Requires (Dev)
- jbzoo/profiler: ^1.0.5
- php-di/php-di: ^6.0.0
- phpunit/phpunit: ^7.5.16
- pimple/pimple: ^3.2.0
README
一个简单而强大的 PSR-11 自动注入依赖注入容器。
mdarc/DI 被设计为易于配置和使用。它为性能而构建。(请参阅 基准测试)
mdarc/DI 拥有一个非常小但强大的代码库。它已准备好投入生产,可用于小型微服务或大型单体项目。
功能
- 自动注入:自动实例化和注入依赖项
- 手动配置:当类无法自动注入时,您可以自己创建它们
- 循环引用检测:它抛出一个包含足够详细信息以修复问题的
CircularReferenceException
mdarc/DI 不适用于什么
- 不支持通过setter方法进行自动注入(并且永远不会支持)
- 不支持使用phpDoc注释进行自动注入(并且永远不会支持)
- 不支持在构造函数参数上自动注入依赖项而无需类型提示。您必须手动配置这些情况
安装
Composer
首先,使用此命令将其添加到您的 composer.json 中
$ composer require mdarc/di "^1.0.0"
用法
创建一个启用自动注入的容器实例是一个创建 Container
实例的问题
use Mdarc\DI\Container; $container = new Container();
如果您的类包含其他对象作为 构造函数参数,则只需这样做
$myClass = $container->get(\Path\To\MyClass::class);
与任何其他DI容器一样,$myClass
在请求的类上始终获取相同的实例。
如果您希望在每次都创建一个新对象(而不是获取相同的对象实例),则使用 工厂 助手
use Mdarc\DI\Container; use Mdarc\DI\DI; $container = new Container([ \Path\To\MyClass::class => DI::factory(function () { return new \Path\To\MyClass(); }), ]); $myClass = $container->get(\Path\To\MyClass::class);
对于无法使用自动注入创建的类,您可以添加它们的 定义
use Mdarc\DI\Container; $container = new Container([ \Monolog\Logger::class => function (Container $c) { $config = $c->get(\Path\To\Config::class); $logger = new \Monolog\Logger($config->get('name')); $logger->pushHandler(new \Monolog\Handler\StreamHandler('php://stdout', \Monolog\Logger::DEBUG)); return $logger; }), ]); $logger = $container->get(\Monolog\Logger::class);
为将接口绑定到实现定义 别名 简单
use Mdarc\DI\Container; $container = new Container([ // Binding Interface to implementation \Psr\Log\LoggerInterface::class => \Monolog\Logger::class, // Concrete implementation \Monolog\Logger::class => function (Container $c) { // build Monolog here }), ]); $logger = $container->get(\Psr\Log\LoggerInterface::class);
为具有构造函数参数的类指定 参数,这些参数是标量、数组或未定义类型
use Mdarc\DI\Container; class MyClass { public function __construct(array $config, \Psr\LoggerInterface $logger) { /*...*/ } } $definitions = [ // Binding Interface to implementation \Psr\Log\LoggerInterface::class => \Monolog\Logger::class, // Concrete implementation \Monolog\Logger::class => function (Container $c) { // build Monolog here }, ]; $constructorParameters = [ MyClass::class => [ 'config' => ['an array', 'of relevant', 'things'] ], ]; $container = new Container($definitions, $constructorParameters); $myClass = $container->get(MyClass::class);
许可证
mdarc/DI 在MIT许可证下授权。