2011-12-22 174 views
3

創建一個新實體我試圖創建一個基於另一個創建的新實體。例如:我有一個關係基於創建另一個(postPersist)Doctrine2

Sale <-- 1:M --> Payment 

現在,當我堅持一個Sale,則必須創建初始Payment但我不知道究竟是如何做到這一點。

我已經嘗試:

  1. 使用@ORM\HasLifecycleCallbacks()@ORM\prePersist@ORM\postPersist,但這些方法並沒有得到論據,我不能堅持實體Payment。我甚至試圖將SalePayment(在prePersist方法$payment->setSale($this)中)聯繫起來,希望EntityManager爲我持續Paymentinfo from here
  2. 我試圖創建一個監聽器(guided from here),但它只是不工作,在任何時候聽者運行
  3. 做在我SaleController::createAction(),這種方式顯然是簡單的工作,但是這是什麼優雅也違背了我的應用程序的良好設計,此操作是業務邏輯的一部分,並在各個部分重複使用。

回答

4

在我列出的3種解決方案中,列出的3中的錯誤依然是最小的錯誤。這很簡單,並不過分複雜,並且以後很容易重構。

但是,如果你正在尋找一個乾淨的解決方案,我認爲你需要的是一個表單處理程序或類似的服務。 看看FOSUserBundle one

基本上,您將在處理完所有銷售表單內容後創建PaymentManager類&,將所有收集的信息傳遞給PaymentManager並讓它處理Payment實體的所有創建/保留邏輯。

+1

+1將工作委派給服務很簡單,並且保持乾爽。 – 2011-12-22 14:42:30

1

我建議@Inori建議的PaymentManager是最好的方法,它是DRY,也是實體創建的中心點。它允許您將控制器中的所有用戶輸入進行編組,然後將其傳遞到管理器上,以正確構建對象Sale

,如果你希望去的選項,並使用生命週期回調我假設你得到的是說非託管實體是另一個實體上發現了異常 - 或東西的效果。爲了解決這個問題,你可以級聯上你的映射堅持這意味着你不需要調用persistPayment

/** 
* One-to-Many via Join Table (aka One-To-Many Unidirectional). 
* @ORM\ManyToMany(targetEntity="Payment", cascade={"persist"}) 
* @ORM\JoinTable(
*  inverseJoinColumns={ 
*   @ORM\JoinColumn(unique=true, onDelete="CASCADE") 
*  } 
*) 
*/ 

你可以,如果它混淆您閱讀更多有關One-To-One, Unidirectional

另外,您應該閱讀關於級聯堅持Transitive persistence/Cascade Operations