是否可以在依赖注入中动态扩展服务?

时间:2016-03-29 09:05:34

标签: symfony service dependency-injection dependencies extending

我正在开发一个Symfony2项目。 Symfony有一个非常酷的依赖注入系统,但我想知道是否有可能动态扩展一些服务......

例如,我有一个供应商服务X,由第三方库/包注册。现在,我需要扩展该服务,让我们称之为Y ... 我可以通过在服务配置中使用相同的服务ID来实现。所以这一切都很好......

但是现在,我需要一个从Y扩展的服务Z,没有服务知道它实际上是从Y而不是X扩展(因为供应商服务是X),所以我可以使用服务Z,就好像它是X一样降低应用程序逻辑而不会丢失Y的功能。

我希望我的解释有点意义,基本上我的问题是:这可能吗?如果是这样,我该如何实现这个目标?

2 个答案:

答案 0 :(得分:1)

我不确切知道你的Z,Y和X是多么紧密,但实现这一点的方法是使用编译器传递,它将允许你改变一个确定的服务的定义和类,一个简单的与bundle的集成看起来像:

http://symfony.com/doc/current/cookbook/service_container/compiler_passes.html

有关容器编译方式的完整文档:

http://symfony.com/doc/current/components/dependency_injection/compilation.html

它不会是微不足道的,因为你必须了解你的捆绑包是如何相互交谈的!但我希望它足够了。

答案 1 :(得分:1)

您可以装饰现有服务而不是替换它:http://symfony.com/doc/current/components/dependency_injection/advanced.html#decorating-services(如果多个定义正在装饰现有服务,您还可以控制应用装饰的顺序)。