2013-06-04 16 views
2

使用Symfony2,我需要在使用$ form-> bind()來比較刷新前的新舊對象之前保存一個實體。在表單綁定之前克隆一個實體

我嘗試了一些功能:

$command = $repository->findCommandProductsByCommand($id); 
$old_command = clone $command; 
// OR $old_command = $command; 
$form = $this->createForm(new EditCommandType(), $command); 

if($request->getMethod() == 'POST') 
{ 
    $form->bind($request); 
    if ($form->isValid()) 
    { 

我試圖挽救實體的這樣一小部分:

$old_command = $command->getCommandProducts(); 

但是,當我試圖訪問的$ old_command與數據其中一種方法,我只能從窗體訪問對象的新值,而不是舊窗體。

$ form-> bind($ request)是主要問題,但是我沒有找到描述exacly綁定()的文檔。

問候

解決我的情況(感謝zizoujab)

$command_entries = new ArrayCollection(); 
foreach ($command->getCommandproducts() as $entry) { 
    $command_entries[] = clone $entry; 
} 

現在我的ArrayCollection $ command_entries不鏈接到以前的實體。

+0

bind()的需要提交的數據,如果你傳遞一個實體設置這些值各自制定者對你的實體。您是否嘗試將舊數據與新數據進行比較?例如,確保密碼更改未使用與以前相同的密碼? – Chausser

回答

3

來自克隆手冊:

當一個對象被克隆,PHP 5將執行所有的 對象的
屬性的淺表副本。任何引用其他變量的屬性都將保留引用。

我假設getCommandProducts()返回ArrayCollection,所以你總是會得到新的列表。

你也必須克隆列表的元素。

這裏是一個充分的解釋和解決方案的示例: Symfony2/Doctrine: How to re-save an entity with a OneToMany as a cascading new row

+0

感謝您的幫助! –