關于教義物體偵聽器,我有一個非常奇怪的行為。我在 symfony 4.4 應用程式中設定了兩個學說物體偵聽器。
service.yaml 中的配置如下所示:
services:
App\EntityListener\MyEntityListener:
tags:
- name: doctrine.orm.entity_listener
event: preUpdate
entity: App\Entity\MyEntity
我遇到了問題,物體偵聽器在本地開發環境中作業得很好,但在生產環境中卻沒有。我已將問題跟蹤到 symfony 除錯模式。如果 symfony 內核有debug=true,物體監聽器會按預期呼叫。如果設定為 false,物體偵聽器由于某種原因不會按原則附加到物體類元資料。我的第一個猜測是快取使用問題,但如果清除快取,問題仍然存在。此外,我沒有任何依賴于Kernel::isDebug().
有誰知道這個問題可能起源于哪里,并且可以提示我尋找解決這個問題的方向?
uj5u.com熱心網友回復:
經過數小時的搜索和除錯,我找到了問題的根源。我在這個專案中使用了多個物體管理器。雖然物體偵聽器系結到一個物體管理器,但學說的類元資料快取卻沒有。因此,當 debug 設定為 true 時,沒有(真正的)快取命中,并且類元資料始終是全新構建的。這保證了物體偵聽器在需要時始終存在。但是當使用快取時,物體類元資料是在每個負責物體的物體管理器的背景關系中構建的。但它仍然被寫入同一個快取存盤。因此,如果第一個物體管理器在由另一個物體管理器管理的類上有一堆物體偵聽器,則物體偵聽器將在快取條目中洗掉,因為元資料條目將被覆寫。
要解決此問題,需要更具體地了解哪些物體由哪個物體管理器管理。將物體偵聽器專門附加到正確的物體管理器也可能會有所幫助。因為如果省略它,物體偵聽器將僅附加到默認物體管理器,而不附加到任何其他物體管理器,在這種情況下,可能會發生此處描述的行為。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/406902.html
標籤:
上一篇:如何通過yaml將自定義路由系結到控制器的方法,而不觸發來自api-platform和symfony的自動查詢?
