2012-12-13 116 views
5

編輯我的帖子使其與Symfony Cookbook相似並添加了一些代碼。在Symfony2中處理大型表單集合的最佳方式

http://symfony.com/doc/current/cookbook/form/form_collections.html

注意,張貼在部分實體/表格碼是一樣的一個在上述鏈接的文檔。

我有一個「任務」實體,它鏈接到「標記」實體。爲了簡單起見,「任務」具有單個字段「描述」,並且「標記」具有單個字段「名稱」 。「標籤」鏈接到一個「任務」,而「任務」鏈接到許多「標籤」。

實體:

class Task 
{ 
    protected $description; 
    protected $tags; 

    public function __construct() 
    { $this->tags = new ArrayCollection(); } 

    public function getDescription() 
    { return $this->description;} 

    public function setDescription($description) 
    { $this->description = $description; } 

    public function getTags() 
    { return $this->tags; } 

    public function setTags(ArrayCollection $tags) 
    { $this->tags = $tags; } 
} 

class Tag 
{ 
    public $name; 
} 

目前,我使用「標籤」的集合中的「任務」的形式編輯全部一次,如Symfony的食譜描述:

形式:

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

    public function setDefaultOptions(OptionsResolverInterface $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class' => 'Acme\TaskBundle\Entity\Tag', 
     )); 
    } 

    public function getName() 
    { 
     return 'tag'; 
    } 
} 


class TaskType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder->add('description'); 

     $builder->add('tags', 'collection', array('type' => new TagType())); 
    } 

    public function setDefaultOptions(OptionsResolverInterface $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class' => 'Acme\TaskBundle\Entity\Task', 
     )); 
    } 

    public function getName() 
    { 
     return 'task'; 
    } 
} 

但是,當我創建「標籤」的集合LA出現問題超過一千個元素。此時,表單需要數秒和數秒才能加載,並且有時會由於內存而崩潰。

$task = new Task(); 

$tag1 = new Tag(); 
$tag1->name = 'tag1'; 
$task->getTags()->add($tag1); 
$tag2 = new Tag(); 
$tag2->name = 'tag2'; 
$task->getTags()->add($tag2); 
//Create a couple thousand more item here ... 

//The script crashes here, when the form is being created 
$form = $this->createForm(new TaskType(), $task); 

錯誤不是來自主義,它很好地處理了整個事情,而是來自Symfony Form。

在這種情況下,使用Symfony2內置表單系統(使用Collections)處理我的表單,還是應該像過去一樣處理它,使用原始html輸入和服務器端驗證/保存?

+0

發佈你的代碼,你指的是什麼部分的symfony文檔? – Squazic

+0

我編輯了我的帖子,關於集合的關於Symfony Cookbook的鏈接。我的代碼在這裏沒有任何重要性,當我執行「$ this-> createForm」時,我只使用鏈接第一部分中描述的表單集合(所有「標記」實體都加載了我的「產品」實體)。 – elwood

+0

你有沒有解決這個問題? – jrjohnson

回答

1

我想知道如果你的問題與此形式的一部分無關,但標籤對象的水化。如果你要求教條爲一大堆物體提供水合物,它將會使用大量的內存。您可能需要考慮另一種保溼標籤的方法,可能是HYDRATE_ARRAY而不是HYDRATE_OBJECT。

+0

是的,我認爲問題的最大部分來自教條保溼。是否有可能創建/綁定我的表單基於一個實體水合作爲一個數組而不是一個對象?我仍然可以驗證實體/保存它們而不用手寫任何東西嗎? – elwood

+0

我們在這裏談論多少個標籤?我可以使用常規方法很快地將500個實體加載到多個擴展實體列表中。 – Mike

+0

編輯我的帖子,提供更多信息。這個問題不是來自於Doctrine,而是來自於Symfony $ this-> createForm()方法。 – elwood

相關問題