此包已被废弃,不再维护。未建议替代包。

1.0.1 2018-09-08 17:32 UTC

This package is auto-updated.

Last update: 2020-12-05 14:21:44 UTC


README

Build Status codecov

VVatashi/DI

PHP7中依赖注入容器的简单且最小化实现。特性

  • 实现了 PSR-11;
  • 代码配置;
  • 使用PHP类名作为标识符;
  • 使用PHP类型提示进行构造函数参数注入。

安装

使用 composer

composer require vvatashi/di

使用

配置容器

创建一个新的容器

$container = new \VVatashi\DI\Container();

使用工厂函数注册类型

当第一次从容器请求指定的类型时,将调用提供的函数。此函数应创建一个兼容类型的实例,可能对其进行某些配置,然后返回它。

此函数接受容器本身作为单个参数,可以使用它作为服务定位器。

$container->registerCallback(LoggerInterface::class, function ($container) {
    // Create the Monolog logger for example.
    $logger = new \Monolog\Logger('test');
    $handler = new \Monolog\Handler\StreamHandler('test.log');
    $logger->pushHandler($handler);
    return $logger;
});

使用类型名注册类型

假设你有以下类型

interface TestInterface {}
class TestClass implements TestInterface {
    public function __construct(LoggerInterface $logger) {
        $logger->log('Howdy world!');
    }
}

你可以将 TestClass 类型注册为当请求 TestInterface 时实例化

$container->registerType(TestInterface::class, TestClass::class);

然后 LoggerInterface 将从容器中自动解析并传递给 TestClass 构造函数。

使用实例注册类型

如果你已经有某种类型的实例,你可以直接注册它

$container->registerInstance(TestInterface::class, $instance);

使用容器

你可以使用 $container->get('class name') 方法将容器用作 服务定位器 并直接从其中实例化某些内容。

然而,这被认为是一种反模式,因为它会强地将你的代码与容器耦合。

在大多数情况下,你应该依赖于构造函数参数的注入。