Symfony未映射的实体表单字段没有数据


Symfony unmapped entity form field not having data

在Symfony 2.6中,我使用了一个未映射的实体表单类型:

$form
->add(
    'myEntity', // Form field name
    'entity',
    [
        'mapped' => false, // Not mapped
        'class' => 'MyVendor'MyBundle'Entity'MyEntity',
        'choices' => $MyEntityCollection, // list of MyEntity
        'property' => 'name',
        'empty_value' => 'Please select MyEntity',
        'empty_data' => null,
        'attr' => [
            'label' => 'My label'
        ]
    ]
);

这允许用户正确选择MyEntity的项目或将其留空。根据这一点,如果选择了任何值,我将添加一个EventSubscriber来修改preSubmitted数据,如果没有选择,则保持原样。

这是事件订阅服务器:

/**
 * {@inheritdoc}
 */
public static function getSubscribedEvents()
{
    return [
        FormEvents::PRE_SUBMIT => 'preSubmitData'
    ];
}
/**
 * @param FormEvent $event
 */
public function preSubmitData(FormEvent $event)
{
    if( null === ($entity = $event->getForm()->get( 'myEntity' )->getData() ) ){
        return;
    }
    // Set value if field has been defined
    $event
        ->getForm()
        ->setData( $entity )
    ;
}

如果用户选择了除空白以外的选项,当我调试preSubmitData函数时:

  • $event->getForm()->get('entity')->getData()赋予null
  • $event->getData()提供一个数组,该数组具有所选实体ID(仅标量值)作为"entity"键

我的问题是:

  • $event->getForm()->get('entity')->getData()不应该有选定的实体吗
  • 如果$event->getData()中至少有实体ID,为什么$event->getForm()->get('entity')->getData
  • 有没有任何方法可以在这里获取实体(就像映射的实体一样),而不必调用实体管理器并通过其ID查询实体

提前感谢!

编辑

从大局来看,在我的全局表单中(此处未描述其他字段),我有两个依赖的字段:

  • 从树中选择A(此处未描述)和一些选项。此选项在全局窗体实体中作为属性存在
  • 第二个B选择名为myEntity(此处描述)。它不作为全局表单实体作为属性存在,因此mapped=false。如果在此处进行了任何选择,则第一个选择(A)的选项将被此选项覆盖。否则,第一个选择保留为实体属性值

希望现在更清晰了。

好的,它给出了null,因为我们正在处理preSubmit事件,这里发送的数据尚未映射到实体中。

将事件更改为submit将根据需要提供映射的实体。