2015-02-08 107 views
2

我使用Symfony Event Dispatcher創建了一些我自己的事件,它工作正常。symfony2事件調度器延遲加載監聽器

但是我注意到,我在symfony中配置的監聽器沒有延遲加載,它始終被初始化。 但很少使用。

我services.yml的配置是這樣的:

my.handler: 
    class: Acme\AcmeBundle\DependencyInjection\MyHandler 
    arguments: 
     - @my.dependency 
    tags: 
     - { name: kernel.event_listener, event: my.event, method: handle } 

有沒有以這樣的方式來配置這一點,@ my.handler當事件被觸發僅初始化的方法嗎? 因爲現在它在分派器中被推入時被初始化(以及它的所有依賴)。

有大約ContainerAwareEventDispatcher文檔: http://symfony.com/doc/current/components/event_dispatcher/container_aware_dispatcher.html 但這只是說明如何直接在PHP中使用它,而不是如何在一個標準的Symfony2項目配置它。

+0

其實服務應該是懶惰加載,但另一點是,該ctor的必須便宜。只需將您的ctor參數保存到私有屬性即可。不要做任何連接或檢查,所以無論是否延遲加載都沒關係。 – Aitch 2015-02-08 22:45:56

+0

是的,所有服務都是延遲加載的,但是它們的依賴關係在使用時也是如此。 EventDispatcher總是在Symfony中使用,所以所有的監聽器都會被加載,包括它們的依賴關係。在每項服務中實施「連接遲到」策略都需要大量的自定義代碼。在這些情況下加載服務懶惰爲常見問題提供了通用解決方案,甚至適用於第三方服務。 – DoppyNL 2015-02-09 17:48:18

+0

另外,構造函數不應該便宜,只要求服務需要什麼。服務應儘可能小,並儘可能將某些任務委託給其他服務。如果你使服務本身「便宜」,構造函數也將變得「便宜」。 – DoppyNL 2015-02-09 17:49:21

回答

2

您可以將其定義爲懶惰服務將相對標籤(如描述here)爲例:

my.handler: 
    class: Acme\AcmeBundle\DependencyInjection\MyHandler 
    lazy: true 
    arguments: 
     - @my.dependency 
    tags: 
     - { name: kernel.event_listener, event: my.event, method: handle } 

記住安裝ProxyManager橋作爲文檔描述。

希望這個幫助

+1

按照鏈接文檔中的說明工作。 ProxyManagerBridge已經安裝在full-stack-symfony中,它仍然需要通過作曲者添加到ocramius/proxy-manager。 – DoppyNL 2015-02-09 17:26:17

+1

另外,它可能會更好(或更快)延遲加載偵聽器的依賴關係,而不是偵聽器本身。但我沒有測試。當使用訂閱者(而不是聽衆)時,你將不得不這樣做。 – DoppyNL 2015-02-09 17:27:25