Php 在Symfony 2中重置提交的表单
我正在将一些来自远程源的数据映射到我的实体。我使用表单来实现这个目的。下面是负责将数据映射到实体的代码片段:Php 在Symfony 2中重置提交的表单,php,symfony,variables,Php,Symfony,Variables,我正在将一些来自远程源的数据映射到我的实体。我使用表单来实现这个目的。下面是负责将数据映射到实体的代码片段: $i = 0; $x = 0; foreach ($bestellerLists[0] as $bestsellerList) { $List[$i] = new BestsellerList(); foreach ($bestsellerList['books'] as $book) { $Book = n
$i = 0;
$x = 0;
foreach ($bestellerLists[0] as $bestsellerList) {
$List[$i] = new BestsellerList();
foreach ($bestsellerList['books'] as $book) {
$Book = new Book();
$bookForm = $this->bookForm;
$bookForm->setData($Book);
$bookForm->submit($book);
$List[$i]->addBook($Book);
unset($bookForm);
unset($Book);
$x = $x + 1;
}
$i = $i+ 1;
}
我无法解决的问题是,在第一次迭代中,如果内部foreach循环一切正常,实体被映射,第一个$Book被添加到当前的$List中
但是,内循环的第二次迭代会出现以下错误:
您不能更改已提交表单的数据
如您所见,$bookForm被赋值为$bookForm=$this->bookForm。在当前迭代结束时,我取消设置$bookForm,以便在下一次迭代中创建一个新的
我真的不明白为什么Symfony会抱怨更改提交表单的数据。每次迭代都应该使用一个新的空表单。你知道我在这里遗漏了什么吗?在我看来,在这种情况下,你只使用FormType进行验证,对吗?@JovanPerovic确实,数据验证将在以后添加到它中。另一个好处是,在使用表单时,我不必手动调用实体上的所有setter。您需要为每次迭代创建一个新表单,因为它会跟踪是否已提交表单,这样就不会提交两次。您将如何进行这项工作取决于您如何生成表单。您甚至可以使用$bookForm=clone$this->bookForm创建一个新实例,但我从未尝试过,所以我不太确定。@Qoop$bookForm=clone$this->bookForm,然后取消设置$bookForm即可完成此任务。.范围太大。。。经过几次迭代后,程序出错,出现OutOfMemory异常。我想知道是什么在这个循环中消耗了这么多内存。克隆的对象被取消设置,输入数据一点也不大。在每次迭代中,$Book被添加到$List中,所以它在增长。垃圾收集也不是立即发生的,它只是在发生的时候发生。如果您计划将这些添加到数据库中,为什么不在每次迭代或10次、50次或任何时候添加每本书,然后检查是否存在一本书,并根据需要进行更新/添加,然后清除管理器。另一件事可能是由于在dev中使用了一些东西,因为这个环境会进行大量日志记录,因此会消耗大量内存。