非映射表单,EntityType和数据属性

时间:2017-04-26 13:25:11

标签: symfony symfony-forms

我使用EntityType创建表单,但未映射到实体。表单很长,用户多次重复使用相同的选项,然后当他对表单有效时,如果它有效,我会将$form->getData()存储在会话中。

当我生成表单时,我会注入$data。除了EntityType之外,它适用于所有选项,我不明白为什么......

$data中,我ArrayCollectionEntityType中选择了对象,但表单未选中它。我使用了mapped = false,因为如果删除它我就会出错:

  

必须管理传递到选择字段的实体。也许坚持他们在实体经理?

有人我知道怎么做?

1 个答案:

答案 0 :(得分:3)

在这种情况下,设置mapped = false不应该是解决方案,因为您需要将存储的数据写入此字段,对吧?因此mapped = false可以避免它(请参阅有关mapped选项here

的更多信息

此处的问题是EntityType需要从每个获取id值,并且要求实际管理这些 EntityManager

  

必须管理传递到选择字段的实体。也许坚持他们在实体经理?

当实体的持久性由MANAGED管理时,实体处于EntityManager状态。换句话说,如果实体从数据库中提取或通过EntityManager#persist注册为新实体,则对其进行管理。

在这种情况下,这些实体来自会话,因此您有两个选项:

  • 从数据库中重新查询存储的实体:

    if (isset($data['foo']) && $data['foo'] instanceof Collection) {
        $data['foo'] = $this->getDoctrine()->getRepository(Foo::class)->findBy([
            'id' => $data['foo']->toArray(),
        ]);
    }
    
  • 或者,设置自定义choice_value选项以避免使用默认选项:

    $form->add('foo', EntityType::class, [
        'class' => Foo::class,
        'choice_value' => 'id', // <--- default IdReader::getIdValue()
    ]);