在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将根据需要提供映射的实体。