chkt / eve
一个简约、灵活且强大的依赖注入系统
Requires
- php: ^7.0
Requires (Dev)
- php-mock/php-mock-phpunit: 1.1.*
- phpunit/phpunit: 5.6.*
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);