2015-04-02 47 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