Symfony服务应该如何包装?

时间:2015-04-02 15:40:59

标签: symfony caching dependency-injection

我的应用程序需要缓存更温暖,但为了让事情变得有趣,这个缓存更加依赖于Symfony路由缓存更加温暖。

在加载路由之前,需要运行我自己的代码,然后在加载后,我需要对生成的路由名执行更多操作。为了实现这个目的,我需要使用我自己的实现来包装内置的路由加热器。

更换原始服务很简单,但如何将该服务注入我的替代服务?

内置类将router服务注入到构造函数中。如果我在我自己的代码中复制了这个(调用new RouteCacheWarmer),它可能会破坏已经替换服务的第三方捆绑包。将服务别名化为我自己的服务,如果另一个包也这样做,也可能会中断。

我的目标是运行自己的缓存加热器,代替路由缓存加热器,但是从我自己的内部运行现有的加热器。同时与其他可能修改了内置服务的软件包一起玩得很好。

2 个答案:

答案 0 :(得分:1)

事实证明,Symfony在2.5版中添加了此功能。它被称为service decoration

bar:
    public: false
    class: stdClass
    decorates: foo
    arguments: ["@bar.inner"]

这会将bar服务设置为foo的别名,同时将foo服务重命名为bar.inner,使其可用于注入。当第三方捆绑包替换foo服务时,其所做的更改不应影响bar服务。

答案 1 :(得分:0)

您可以使用链式路由器,这样您就可以让Symfony路由器做自己的事情,然后完全单独运行您的路由器。 Symfony CMF在RoutingBundle component中提供此类功能。