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

时间:2015-03-04 15:37:31

标签: php forms symfony

在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数据,如果没有选择,我会保持原样。

这是eventSubscriber:

/**
 * {@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 (只是标量值)的“实体”键

我的问题是:

  • 不应该是$ event-> getForm() - > get('entity') - > getData()是否拥有所选实体?
  • 为什么$ event-> getForm() - > get('entity') - > getData()如果$ event-> getData()至少包含实体ID,则为null?
  • 有没有办法在这里获取实体(与映射实体一样),而无需调用实体管理器并通过其ID查询实体?

提前致谢!

修改

总体而言,在我的全球形式(此处未描述的其他字段)中,我有2个依赖字段:

  • 选择 A (此处未说明),其中包含树中的一些选项。此选项在全局表单实体中作为属性存在。
  • 第二个 B 选择名为 myEntity (此处描述)。它不作为属性的全局表单实体存在,因此mapped = false。如果在此处做出任何选择,则第一个选择( A )的选项将被此选项覆盖。否则,第一选择仍然是实体属性值。

希望现在更清楚了。

1 个答案:

答案 0 :(得分:0)

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

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