mdarc/di

一个简单而强大的PSR-11自动注入依赖注入容器

v1.0.4 2020-02-16 08:18 UTC

This package is auto-updated.

Last update: 2024-09-16 18:11:04 UTC


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许可证下授权。