假设我有一个主窗体(foo实体形式),其中我有一个嵌入式窗体(条形实体嵌入窗体)。 我们也说foo - 1 / many - bar(当然)。
现在,我想在系统中显示所有可能的bar实体,即使它们与foo无关。所以在使用foo实体绑定表单之前,我通常会进行一些查询,提取数据,如果bar还没有与foo关联,则关联它(基本上我创建了一些在某些情况下不会持久化的“虚拟”关联。我不能使用symfony2本机方法,因为我需要处理一些属性而Symfony2不允许我这样做)
所有的作品都像魅力。现在我添加到bar形成一个非映射字段,这应该帮助我知道何时保存或不保存关联。
进入控制器我检查是否存在该字段,如果没有,我人为地从请求对象中取消设置集合的索引。当我转储请求时一切都很好(没有标志的嵌入式元素不再存在)。
当我将请求对象绑定到实体时,所有嵌入的表单元素仍然存在。这让我完全厌倦了。
(我不会粘贴实体代码,因为问题不存在。我也不会粘贴表单代码)
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)
}
}
答案 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);
}
}
}
}
有更好的解决方案吗?