heyday/symfony-autoinject

允许在 Symfony DI 中进行自动注入

该软件包的规范存储库似乎已消失,因此软件包已被冻结。

0.2.2 2014-07-07 23:20 UTC

This package is auto-updated.

Last update: 2024-04-29 03:18:04 UTC


README

Build Status

Symfony AutoInject 为 Symfony 依赖注入提供了可选的服务自动注入。

安装(使用 composer)

$ composer require heyday/symfony-autoinject

使用方法

通过两个服务标签 "autoinject" 和 "autoinject.provides" 实现自动注入的选项

标签的使用方法如下

"autoinject"

示例: { name: autoinject }

示例: { name: autoinject, arguments: true, setter: true, adder: true }

当 "all" 设置为 true 或未提供额外参数时,以下设置均适用

当 "arguments" 设置为 true 时,编译器传递将尝试查找服务参数,如果找到则提供,否则报错。无法自动注入的参数需要手动提供。

“setter”、“arguments” 和 "adder" 都是可选的

当 "setter" 设置为 true 时,编译器传递将尝试找到与类上找到的 setter 参数匹配的提供的服务

当 "adder" 设置为 true 时,编译器传递将尝试找到与类上找到的 adder 方法参数匹配的服务,并将为找到的每个服务添加一个方法调用到 adder 上

"autoinject.provides"

示例: { name: autoinject.provides }

示例: { name: autoinject.provides, interfaces: true, classes: true }

当 "all" 设置为 true 或未提供额外参数时,以下设置均适用

“interfaces” 和 "class" 都是可选的

当 "interfaces" 设置为 true 时,编译器传递将服务注册为提供实现该类的所有接口的实例,因此当在参数、setter 和 adder 中遇到接口时,提供的服务将被提供

当 "classes" 设置为 true 时,编译器传递将服务注册为提供该类及其父类的实例,因此当在参数、setter 或 add 中遇到相同类型的类时,提供的服务将被提供

汇总所有内容

构造函数注入

class Service
{
}

class Service2
{
	protected $service;
	public function __construct(Service $s)
	{
		$this->service = $s;
	}
}

配置

services:
	my_service:
		class: Service
		tags:
			- { name: "autoinject.provides" }
			
	my_service2:
		class: Service2
		tags:
			- { name: "autoinject" }

在这个例子中,my_service 提供了一个 Service 类型的服务实例,而 my_service2 请求自动注入。

这些标签导致编译器传递看到 my_service2 正在请求自动注入,它有一个期望 Service 实例的构造函数,并且有一个由 my_service 提供的 Service 实例。自动注入是可以解决的,并且容器被配置为通过构造函数注入将 my_service 提供给 my_service2

单元测试

$ composer install --dev
$ vendor/bin/phpunit