我正在开发一个Symfony2项目。 Symfony有一个非常酷的依赖注入系统,但我想知道是否有可能动态扩展一些服务......
例如,我有一个供应商服务X,由第三方库/包注册。现在,我需要扩展该服务,让我们称之为Y ... 我可以通过在服务配置中使用相同的服务ID来实现。所以这一切都很好......
但是现在,我需要一个从Y扩展的服务Z,没有服务知道它实际上是从Y而不是X扩展(因为供应商服务是X),所以我可以使用服务Z,就好像它是X一样降低应用程序逻辑而不会丢失Y的功能。
我希望我的解释有点意义,基本上我的问题是:这可能吗?如果是这样,我该如何实现这个目标?
答案 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(如果多个定义正在装饰现有服务,您还可以控制应用装饰的顺序)。