首页 文章

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

提问于
浏览
2

在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() 给出一个数组,其中包含'entity'键所选的 entity ID (只是标量值)

我的问题是:

  • Shouldn 't $event->getForm()->get(' entity') - > getData()有选定的实体吗?

  • 为什么$ event-> getForm() - > get('entity') - > getData()如果$ event-> getData()至少包含实体ID,则给出null?

  • 有没有办法在这里获取实体(与映射实体一样),而无需调用实体管理器并通过其ID查询实体?

提前致谢!

Edit

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

  • 使用树中的一些选项选择 A (此处未描述) . 此选项在全局表单实体中作为属性存在 .

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

希望现在更清楚了 .

1 回答

  • 0

    好吧,它给出了null,因为我们在 preSubmit 事件上,并且此处发送的数据尚未映射到实体中 .

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

相关问题