Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在Symfony 2中重置提交的表单_Php_Symfony_Variables - Fatal编程技术网

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中使用了一些东西,因为这个环境会进行大量日志记录,因此会消耗大量内存。