2015-04-02 50 views
1

我的应用程序需要一个缓存加热器,但为了使事情变得有趣,这个缓存加热器依赖于Symfony路由缓存加温器。Symfony服务应该如何包装?

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

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

内置类已将router服务注入到构造函数中。如果我在我自己的代码中复制了这个(请致电new RouteCacheWarmer),它可能会破坏已替换服务的第三方包。如果另一个捆绑包的功能相同,也可能会破坏服务。

我的目标是运行我自己的高速缓存加热器,代替路由高速缓存加热器,但运行我自己的现有加热器。同时与其他可能已经修改了内置服务的软件包配合使用。

回答

1

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

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

这台bar服务作为别名foo,而在同一时间重命名foo服务bar.inner使其可用于注射。当第三方软件包替代foo服务时,它所做的更改不应影响bar服务。

0

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

+0

我当时看过CMF包。它取代了'Router'类而不是'RouteCacheWarmer'。基本上,它会在运行时创建路线,而缓存加热器只会在预热时间。使用他们的方法会对每个请求造成太多的开销。 – Twifty 2015-04-09 17:17:21

+0

这是捆绑包的DynamicRouter部分,但我指的是ChainRouter服务。它允许您包含多个路由器并将所有路由编译到一个RouteCollection中。当然,你可以采取[ChainRouter来源](https://github.com/symfony-cmf/Routing/blob/master/ChainRouter.php),而不需要整个组件。 – 2015-04-09 17:42:59

+0

我明白你的建议,但它没有回答这个问题。要使用链式加热器,我仍然需要将现有的加热器服务注入我自己,然后替换现有的加热器。我可以在编译器通行证中执行此操作,但如果另一个捆绑编译器通行证也想要取代该服务(取决于通行顺序),将会删除其中一个修改后的服务。 – Twifty 2015-04-09 18:13:37