2016-03-27 32 views
-1

編輯:爲了避免混淆,這個問題是關於Entity Listener不是Event Listener的Symfony /原則EventSubscriber VS EntityListener

我學習Symfony的事件,並尋找到EntityListeners和EventSubscribers如何工作。

據我所知,EntityListener只附加到一個實體,而EventSubscriber方法被所有實體調用。最終在EventSubscriber類我必須做這樣的事情:

public function prePersist(LifecycleEventArgs $args) 
{ 
    $object = $args->getObject(); 

    if ($object instanceof xxxxxxx) { 
     $this->doSomething(); 
    } 
} 

所以這樣看來,每當我需要聽一個單一的實體的事件,我應該用EntityListener,當我要聽事件在所有Doctrine實體中,我應該使用EventSubscriber。

但是......看着最受歡迎的軟件包,如FOSUserBundle,VichUploaderBundle,SonataMediaBundle等,它們都使用EventSubscriber界面,而且都沒有使用EntityListener。儘管他們只需要聆聽一個實體。

我還沒有看到使用EntityListener的包。

我的問題是:爲什麼?

從我的角度來看,EntityListener應該更有效率,因爲它只會觸發單個實體。調用說,每個實體更新20個更新前的訂閱者看起來並不是非常優化的?

回答

0

EntityListener僅附加到一個實體,而EventSubscriber 方法被所有實體調用。

您無法將EntityListeners與EventListeners/EventSubscribers進行比較。

Different from Implementing Event Listeners an Entity Listener is invoked just to the specified entity.

實體監聽器:An entity listener is a lifecycle listener class used for an entity.

即使聽衆:They sit at a level above the entities and allow you to implement re-usable behaviors across different entity classes.

援引@stof有關事件偵聽器和事件訂閱者之間的差異:

用戶的主要優勢(和Symfony爲什麼將 轉換爲th em在2.1中)的原因是它保留了 類中事件的知識,而不是服務定義中的事件,這使得更容易在其他上下文中重用偵聽器(例如Silex,這就是爲什麼 Symfony代碼已更改)。

在另一方面,註冊聽衆通過服務定義 提供了更多的靈活性,以捆綁的DI設置(允許添加 有條件根據配置例如標籤)

+0

你確定是指EntityListener而不是EventListener? EntityListener似乎已被添加到Symfony 2.4中 – Karolis

+0

您正在混合的東西。 EntityListener不是EventListener/EventSybscriber。他們在不同的學說層面工作。檢查我更新的答案。 –