2016-09-06 47 views
2

我試圖管理的Thing個列表,任何Thingnameamount堅持獨立CollectionType(添加/刪除)

實體

class Thing 
{ 
    // ... 

    /** 
    * @var string 
    * 
    * @ORM\Column(type="string") 
    */ 
    private $name; 

    /** 
    * @var integer 
    * 
    * @ORM\Column(type="integer") 
    */ 
    private $amount; 
} 

形式

class ThingFormType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('name') 
      ->add('amount') 
     ; 
    } 

    public function configureOptions(OptionsResolver $resolver) 
    { 
     $resolver 
      ->setDefaults(array(
       'data_class' => Thing::class, 
      )) 
     ; 
    } 
} 

形式收集

class ThingsFormType extends AbstractType 
{ 
    public function configureOptions(OptionsResolver $resolver) 
    { 
     $resolver->setDefaults(array(
      'entry_type' => ThingFormType::class, 
      'allow_delete' => true, 
      'allow_add' => true, 
     )); 
    } 

    public function getParent() 
    { 
     return CollectionType::class; 
    } 
} 

測試

$things = array(
    $this->getReference('thing1'), // My Fixtures 
    $this->getReference('thing2'), // 
); 
$form = $this->formFactory->create(ThingsFormType::class, $things); 
$serializedForm = FormHelper::serializeForm($form); 
unset($serializedForm[0]);   // Removing 
$serializedForm[1]['name'] = 'Stuff'; // Updating 
$serializedForm[2] = array(   // Adding 
    'name' => 'Chouette', 
    'amount' => 42, 
); 
$form->submit($serializedForm); 
$this->assertTrue($form->isValid()); 
$this->em->flush(); 

正如你所看到的,我刪除Thing0,更新1和添加新2

表單成功綁定,我可以看到我的新對象組合良好,但我在沖洗時只能看到UPDATE1

我該如何讓教條通知添加和刪除的?

如果可能,我寧願不必瀏覽整個集合以進行檢查。

回答

0

由於我沒有真的需要刪除畢竟任何東西,這裏是我做的主要是:

function updateThings(array $things) { 
    foreach ($things as $thing) { 
     $this->em->persist($thing); 
    } 
    $this->em->flush(); 
} 

在另一隻手,我趕緊看了看PersistentCollection這似乎有一些嵌入式的同步機制(getSnapshot()getDeleteDiff(),...),但也似乎取決於實體關係(getOwner()),並沒有找到任何有關它的「獨立使用」文檔。