2012-05-24 58 views
57

我在Symfony2框架中工作,想知道何時會使用Doctrine訂戶而不是聽衆。對於聽衆而言,Doctrine的documentation非常清晰,但用戶相當掩飾。 Symfony的cookbook entry與此類似。學說聽衆與訂閱者

+0

羅斯塔克有Doctrine2對DutchPHPConference談了一些天前。他還在Doctrine2中處理了這些事件,他的幻燈片在這裏:http://www.slideshare.net/rosstuck/extending-doctrine-2-for-your-domain-model-13257781也許它可能是一些額外的信息/幫助爲你。 –

回答

66

從我的角度來看,只有一個主要區別:

  • 監聽器被註冊,指定所偵聽的事件。
  • 認購人告訴哪些事件是聽

這看起來可能是一個很大的區別調度的方法,但是如果你想想看,當你想通過使用一個有一些情況另一個:

  • 您可以將一個偵聽器分配給具有不同事件的多個調度器,因爲它們是在註冊時設置的。您只需確保每個方法都在收聽者處就位
  • 您可以更改用戶在運行時註冊的事件,甚至可以在註冊用戶之後通過更改getSubscribedEvents的返回值(考慮您收聽的時間到一個非常嘈雜的事件,你只想執行一次)

有可能有其他的差異,但我不知道,但!

+16

所以,簡而言之,訂閱者是一個監聽者,監聽的事件列表是可變的嗎?在'getSubscribedEvents'中,我會返回一個數組,類似'array(Events :: prePersist,Events :: postUpdate)'我猜? – nurikabe

+5

是的。看看這裏:http://docs.doctrine-project.org/projects/doctrine-orm/en/2.0.x/reference/events.html#the-event-system – Sgoettschkes

5

都允許您在一個特定事件前/後執行的東西依然存在等

但是聽衆只允許你執行你的實體包裹內的行爲。所以一個例子可能是更新「date_edited」時間戳。

如果您需要移出實體環境,那麼您需要訂閱者。一個很好的例子可能是調用外部API,或者如果您需要使用/檢查與您的實體不直接相關的數據。

+5

我可能會誤解,但這聽起來像生命週期回調和事件偵聽器之間的區別?我試圖確定何時可以使用(以Symfony2術語)「doctrine.event_subscriber」而不是「doctrine.event_listener」。 – nurikabe

+0

你的權利,我誤解了你的問題,表示歉意。 –

7

當你想要在一個類中處理多個事件時,你應該使用事件訂閱者,例如在這個symfony2 doc page article中,可能會注意到事件偵聽器只能管理一個事件,但可以說你想處理幾個事件一個實體,prePersist,preUpdate,postPersist等等...如果你使用事件監聽器,你將不得不編寫幾個事件監聽器,每個事件監聽器一個,但是如果你使用事件訂閱者,你只需要編寫一個事件驅動器類,通過事件訂閱者,您可以在一個類中管理多個事件,這就是我使用它的方式,我主要關注的是模型業務需要的代碼,其中一個例子可能是您希望處理多個生命週期事件globaly只適用於一組實體,要做到這一點,您可以編寫一個父類並在其中定義這些全局方法,然後讓喲你的實體繼承這個類,然後在你的事件中,你訂閱你想要的每個事件,prePersist,preUpdate,postPersist等......然後請求這個父類並執行這些全局方法。

+3

我可能誤解了你,但在我的體驗Listener可以管理多個事件,例如一個Listener可以爲prePersist,preUpdate,onFlush等定義動作。 –

+0

@ChadwickMeyer其次,'這個監聽器可以監聽一個或多個事件,並在每次調度這些事件時收到通知。'直接從文檔 – Dheeraj

2

另一件重要的事情:Doctrine EventSubscribers不允許您設置優先級。

瞭解更多關於這個問題here

+0

燈泡繼續。謝謝! – nurikabe