我在Symfony2框架中工作,想知道何時會使用Doctrine訂戶而不是聽衆。對於聽衆而言,Doctrine的documentation非常清晰,但用戶相當掩飾。 Symfony的cookbook entry與此類似。學說聽衆與訂閱者
學說聽衆與訂閱者
回答
從我的角度來看,只有一個主要區別:
- 監聽器被註冊,指定所偵聽的事件。
- 認購人告訴哪些事件是聽
這看起來可能是一個很大的區別調度的方法,但是如果你想想看,當你想通過使用一個有一些情況另一個:
- 您可以將一個偵聽器分配給具有不同事件的多個調度器,因爲它們是在註冊時設置的。您只需確保每個方法都在收聽者處就位
- 您可以更改用戶在運行時註冊的事件,甚至可以在註冊用戶之後通過更改
getSubscribedEvents
的返回值(考慮您收聽的時間到一個非常嘈雜的事件,你只想執行一次)
有可能有其他的差異,但我不知道,但!
所以,簡而言之,訂閱者是一個監聽者,監聽的事件列表是可變的嗎?在'getSubscribedEvents'中,我會返回一個數組,類似'array(Events :: prePersist,Events :: postUpdate)'我猜? – nurikabe
是的。看看這裏:http://docs.doctrine-project.org/projects/doctrine-orm/en/2.0.x/reference/events.html#the-event-system – Sgoettschkes
都允許您在一個特定事件前/後執行的東西依然存在等
但是聽衆只允許你執行你的實體包裹內的行爲。所以一個例子可能是更新「date_edited」時間戳。
如果您需要移出實體環境,那麼您需要訂閱者。一個很好的例子可能是調用外部API,或者如果您需要使用/檢查與您的實體不直接相關的數據。
我可能會誤解,但這聽起來像生命週期回調和事件偵聽器之間的區別?我試圖確定何時可以使用(以Symfony2術語)「doctrine.event_subscriber」而不是「doctrine.event_listener」。 – nurikabe
你的權利,我誤解了你的問題,表示歉意。 –
當你想要在一個類中處理多個事件時,你應該使用事件訂閱者,例如在這個symfony2 doc page article中,可能會注意到事件偵聽器只能管理一個事件,但可以說你想處理幾個事件一個實體,prePersist,preUpdate,postPersist等等...如果你使用事件監聽器,你將不得不編寫幾個事件監聽器,每個事件監聽器一個,但是如果你使用事件訂閱者,你只需要編寫一個事件驅動器類,通過事件訂閱者,您可以在一個類中管理多個事件,這就是我使用它的方式,我主要關注的是模型業務需要的代碼,其中一個例子可能是您希望處理多個生命週期事件globaly只適用於一組實體,要做到這一點,您可以編寫一個父類並在其中定義這些全局方法,然後讓喲你的實體繼承這個類,然後在你的事件中,你訂閱你想要的每個事件,prePersist,preUpdate,postPersist等......然後請求這個父類並執行這些全局方法。
我可能誤解了你,但在我的體驗Listener可以管理多個事件,例如一個Listener可以爲prePersist,preUpdate,onFlush等定義動作。 –
@ChadwickMeyer其次,'這個監聽器可以監聽一個或多個事件,並在每次調度這些事件時收到通知。'直接從文檔 – Dheeraj
不知道這是否是有意或無意做。但用戶有聽衆更高的優先級 - https://github.com/symfony/symfony/blob/master/src/Symfony/Bridge/Doctrine/DependencyInjection/CompilerPass/RegisterEventListenersAndSubscribersPass.php#L73-L98
從理論方面,它並不關心它是什麼(聽衆或用戶),最終都已註冊爲聽衆 - https://github.com/doctrine/common/blob/master/lib/Doctrine/Common/EventManager.php#L137-L140
這就是我發現的。
- 1. 學說記錄聽衆從未解僱
- 2. Laravel聽衆訂閱所有活動
- 3. Symfony的例外註冊新學說事件訂閱者(SoftDeleteable)
- 4. 學說 - preUpdate事件訂閱者根本不被解僱
- 5. 學說更新前的聽衆不是在數據庫
- 6. 春天卡夫卡消費者 - 並行聽衆與非併發聽衆雲
- 7. 鈦合金推送通知訂閱但聽衆沒有開機
- 8. 訂單通過與學說多個列
- 9. RxJava等待一個觀察者與訂閱者等待另一個觀察者與其他訂閱者
- 10. 打印訂閱者以獲得與Newsstand的免費訂閱?
- 11. 遍歷訂閱者
- 12. Disqus - 訂閱作者
- 13. JavaFX的財產聽衆訂貨
- 14. 傾聽聽衆
- 15. 存儲庫與服務 - 訂閱 - 兩者?
- 16. wso2mb:與持久訂閱者錯誤
- 17. IllegalStateException當調用訂閱者onError()與OutOfMemoryException
- 18. 商店取消訂閱與觀察者
- 19. ZeroMQ與PHP訂閱者丟失郵件
- 20. NServiceBus從v3.0訂閱者訂閱到v2.6發佈者
- 21. CometD訂閱監聽器
- 22. 如何控制Scala搖擺者聽衆
- 23. 觀察者設計模式vs「聽衆」
- 24. Symfony的2註冊一個學說聽者不工作
- 25. 與JComponents形式的聽衆
- 26. 聽衆與機器人類
- 27. 與學說
- 28. 學說與MAX()
- 29. 與學說ORM
- 30. 學說與mamp?
羅斯塔克有Doctrine2對DutchPHPConference談了一些天前。他還在Doctrine2中處理了這些事件,他的幻燈片在這裏:http://www.slideshare.net/rosstuck/extending-doctrine-2-for-your-domain-model-13257781也許它可能是一些額外的信息/幫助爲你。 –