2016-12-04 45 views
-1

我花了3小時試圖在社交網絡上的PostPersist callback一些鏈接分享。但是,這些鏈接在社交網絡頁面上給了我404 error。我只是想出了當PostPersist回調觸發時我並不存在的數據。但是,在entity->flush()之後的控制器中,我使用了相同的代碼,然後鏈接正常工作。爲什麼Symfony的使用PostPersist學說

我想知道,到底爲什麼人們使用

/** 
* @ORM\PostPersist 
*/ 

回調。

+3

什麼東西有你的社交網絡網站的故事做的,爲什麼你會使用PostPersist的問題?創建實體後,使用PostPersist將郵件發送給用戶,因此它基於事件。所以你不需要在每次刷新後在每個爲你創建實體的控制器中執行它。 – Kwido

+0

我同意,在情況下,它是考慮使用[自定義事件訂戶]上的每個持續給定實體的發生的事件(http://symfony.com/doc/current/doctrine/event_listeners_subscribers.html)。它們比任何回調事件更靈活。 – ferdynator

+0

@Kwido社交網絡的例子是解釋在PostPersist回調期間數據還沒有插入到數據庫中。但是在調用flush()後數據已經插入數據庫。 – user3502626

回答

2

Doctrine2 documentation

postPersist - 實體已經被持久化後的postPersist事件發生時一個實體。它將在數據庫插入操作之後被調用。生成的主鍵值在postPersist事件中可用。

但是我們必須考慮Doctrine2默認情況下默認調用事務。在這種方法中,事務在您的實體管理器上使用flush()時結束。這就是爲什麼你不能看到你的數據庫中的數據,除非你刷新實體經理。 EntityManager#flush()是事務開始和結束的地方。儘管如此,我們也可以顯式調用事務,但它也不會讓您在啓動事務,持久對象和提交事務之間看到數據庫中的數據。

事實上,你不能省略Doctrine2交易,所以你不能指望你的數據是可見的只是堅持的行動後,當PostPersist事件發生。

爲了實現這一目標,你必須使用PostFlush事件。

Postperist在我的現實生活經驗用於例如:

  1. 創建依賴於創建的對象(即自動轉換,自動日期,一些特定的關係更新)
  2. 將通知發送到數據其他事件
  3. 發送電子郵件

我希望這有助於。

編輯
看看onFlush事件在這裏你可以看到如何通過遍歷工作單元的例子讓你的對象的示例。 onFlush examples

要只對特定對象的工作只是用:

if ($entity instanceof Product) { 
     // do something with the YourEntityName 
} 
+0

問題是,Doctrine2說:postFlush - postFlush事件發生在刷新操作結束時。 **此事件不是生命週期回調。** – user3502626

+0

而您的Postpersist示例還可以。除非在數據被插入到數據庫之前,我不同意發送電子郵件。 – user3502626

+0

@ user3502626看看我的編輯。 –