chkt/eve

一个简约、灵活且强大的依赖注入系统

v1.0.0 2018-05-26 05:08 UTC

This package is auto-updated.

Last update: 2024-09-07 19:01:43 UTC


README

一个简约、灵活且强大的依赖注入器

eve 是一个小型(约 250 行可执行代码)的自包含 依赖注入器,它选择使用 配置方法 而不是反射、注解或其他类似的元编程技术。

依赖项在代码中与它们的类一起定义,提供了对对象创建、共享和缓存的高度控制。

安装

您可以使用 composer 安装 eve。

命令行

$ php composer.phar install chkt/eve

composer.son

{
  "require" : {
    "chkt/eve" : "<version>"
  }
}

或者,您可以将 github 仓库 克隆到您喜欢的位置。

$ git clone https://github.com/chkt/eve.git

基本用法

注入器依赖于一些辅助程序来解析和注入依赖项。所有这些都被组合到 InjectorDriver 中。

use \eve\common\factory\BaseFactory;
use \eve\driver\InjectorDriverFactory;

$base = new BaseFactory();
$factory = $base->produce(InjectorDriverFactory::class, [ $base ]);
$driver = $factory->produce([...]);

第一行创建了一个 BaseFactory,它提供了实例化对象的基本手段。在第二行中,使用 BaseFactory 创建了一个 InjectorDriverFactory,然后在第三行中创建了一个 InjectorDriver

可注入对象类型取决于驱动器的配置。配置驱动器的选项列在 驱动器文件夹 中。

使用注入器很简单。

$injector = $driver->getInjector();

$object = $injector->produce(\namespace\ClassName::class, [...]);

可选的第二个参数允许将额外的配置选项传递给注入器。

由于 eve 不使用反射或其他元编程技术,它依赖于实现了 \eve\inject\IInjectable 的可注入对象,该接口定义了单个静态方法 getDependencyConfig

use eve\access\ITraverableAccessor;
use eve\inject\IInjectable;
use eve\inject\IInjector;

class ExampleClass
implements IInjectable
{
  
  static public function getDependencyConfig(ITraversableAccessor $config) {
    return [
      'injector:',
      'providerName:providableObject?key=value',
      [
        'type' => 'argument',
        'data' => $config->hasItem('options') ? $config->getItem('options') : []
      ]
    ];
  }
  
  public function __construct(IInjector $injector, ProvidableObject $object, array $options) {
  
  }
}

getDependencyConfig 方法定义了新实例应使用哪些类型的参数来创建。

依赖项可以是包含一个 'type' 和一个或多个附加键的 数组,或者可以使用 实体 语法定义,通过格式化的 字符串 引用依赖项。

在上面的示例中,注入器将自身作为第一个构造函数参数注入。第二个参数是一个在名为 'providerName' 的提供者处注册为 'providableObject' 的对象,并使用 key=value 进行配置。

如果注入器提供了一个包含名为 'options' 的属性的数组,作为其第二个参数,它将作为第三个参数提供。

$injector->produce(\exampleNamespace\ExampleClass::class, [ 'options' => [...] ]);

如果没有为注入器提供第二个参数,或者它不包含 'options' 属性,则 getDependencyConfig 返回一个空数组作为第三个参数。

$injector->produce(\exampleNamespace\ExampleClass::class);