2017-02-24 62 views
2

考慮Symfony的應用程序下面的步驟:獲取有關學說postFlush事件刷新實體

  1. 註冊聽衆爲傾倒的工作單位getScheduledEntityInsertions()結果Doctrine`s postFlush事件。
  2. 創建SomeEntity類的實例。
  3. 呼叫實體Manager`s persistflush方法與先前創建的實體實例
  4. postFlush監聽器發射
  5. getScheduledEntityInsertions()調用任何回報

預期的行爲是在最後一步我看到插入的實體的列表,但如果你看看UoF的executeInserts()方法,unset($this->entityInsertions[$oid])要求每個實體,所以nothig從getScheduledEntityInsertions()呼叫返回。

蔭發現拒絕補丁的話:https://github.com/doctrine/doctrine2/pull/5674和Ocramius建議使用「onFlush」事件收集所有需要的數據,併發射自定義事件:https://groups.google.com/forum/#!topic/doctrine-user/GLJEx0p5kL4

但是,我不明白,它是如何工作的:如果我爲myCustomEvent註冊自定義偵聽器,並從onFlush中觸發它,並帶有未插入實體列表 - 它將在實體保存到數據庫之前執行(postFlush已觸發),並且無法從此偵聽器的數據庫中接收。

+0

可能的解決方案之一是對onFlush和postFlush事件使用一個Listener類,在onFlush中使用必要的數據填充內部屬性,在postFlush中讀取數據屬性。但是這個解決方案有一定的侷限性:兩個監聽器方法必須被定義爲相同的類;監聽器不是線程安全的。 – Alex

回答

2

一個可能的解決方案是使用一個監聽器類onFlushpostFlush事件,並在onFlush填充內部屬性提供必要的數據,在postFlush物業讀取數據。但是這個解決方案有一定的侷限性:兩個監聽器方法必須被定義爲相同的類;監聽器不是線程安全的。