2012-12-13 74 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

相关问题