我使用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項目配置它。
其實服務應該是懶惰加載,但另一點是,該ctor的必須便宜。只需將您的ctor參數保存到私有屬性即可。不要做任何連接或檢查,所以無論是否延遲加載都沒關係。 – Aitch 2015-02-08 22:45:56
是的,所有服務都是延遲加載的,但是它們的依賴關係在使用時也是如此。 EventDispatcher總是在Symfony中使用,所以所有的監聽器都會被加載,包括它們的依賴關係。在每項服務中實施「連接遲到」策略都需要大量的自定義代碼。在這些情況下加載服務懶惰爲常見問題提供了通用解決方案,甚至適用於第三方服務。 – DoppyNL 2015-02-09 17:48:18
另外,構造函數不應該便宜,只要求服務需要什麼。服務應儘可能小,並儘可能將某些任務委託給其他服務。如果你使服務本身「便宜」,構造函數也將變得「便宜」。 – DoppyNL 2015-02-09 17:49:21