在绑定之前从post中删除实体

时间:2014-12-05 09:12:46

标签: symfony

假设我有一个主窗体(foo实体形式),其中我有一个嵌入式窗体(条形实体嵌入窗体)。 我们也说foo - 1 / many - bar(当然)。

现在,我想在系统中显示所有可能的bar实体,即使它们与foo无关。所以在使用foo实体绑定表单之前,我通常会进行一些查询,提取数据,如果bar还没有与foo关联,则关联它(基本上我创建了一些在某些情况下不会持久化的“虚拟”关联。我不能使用symfony2本机方法,因为我需要处理一些属性而Symfony2不允许我这样做)

所有的作品都像魅力。现在我添加到bar形成一个非映射字段,这应该帮助我知道何时保存或不保存关联。

进入控制器我检查是否存在该字段,如果没有,我人为地从请求对象中取消设置集合的索引。当我转储请求时一切都很好(没有标志的嵌入式元素不再存在)。

BUT

当我将请求对象绑定到实体时,所有嵌入的表单元素仍然存在。这让我完全厌倦了。

代码示例

(我不会粘贴实体代码,因为问题不存在。我也不会粘贴表单代码)

public function createAction()
{
  $foo = new Foo();
  $foo_form = $this->createForm(new FooType(), $foo);
  if ($request->getMethod() == 'POST') {
    $parameter_array = $request->request->all();
    $bar_array = $parameter_array['foo']['bar'];
    //If I dump here, of course, all bar are setted
    foreach ($bar_array as $index => $bar) {
      if (!isset($bar['associate'])) { //this is the flag 
        unset($parameter_array['foo']['bar'][$index]);
      }
    }
    $request->request->replace($parameter_array);
    //If i dump $request->request->all(); all non-flagged bar are gone
    $foo_form->bind($request);
    $foo->getBars(); //If I dump this all bar(s) are still there (even the not-flagged ones)
  }
}

1 个答案:

答案 0 :(得分:0)

我找到了解决方法。因为我不能控制器 - 或者至少看起来我不能 - 在涉及实体时直接参数包,我只是在形式和对象被绑定之后对象进行操作。

我的代码现在是

public function createAction()
{
  $foo = new Foo();
  $foo_form = $this->createForm(new FooType(), $foo);

  if ($request->getMethod() == 'POST') {
    $foo_form->bind($request);
    if ($foo_form->isValid()) {
      $parameter_array = $request->request->all();
      if (isset($parameter_array['foo']['bar'])) {
        $bars = $foo->getBars();
        $bar_array = $parameter_array['foo']['bar'];
        foreach ($bar_array as $index => $bar) { //Of course here
          if (!isset($bar['associate'])) { // I can use array_filter
            $bars->remove($index); // or something similar. Is just more readable that way for this answer
          }
        }
        $foo->setBars($bars);
      }
    }
  }
}

有更好的解决方案吗?