Forms Symfony2表单-嵌入表单上的事件侦听器

Forms Symfony2表单-嵌入表单上的事件侦听器,forms,symfony,symfony-2.3,Forms,Symfony,Symfony 2.3,从symfony cookbook中关于动态表单生成()的示例开始 我复制了此代码,但有所不同,我将此表单嵌入到父表单中(为示例SportPlayerType而调用) SportPlayerType映射到实体SportPlayer,该实体包含两个属性:$name和$meetup、一个字符串和一个SportMeetup 我的问题在于lambda函数,addEventListener的参数: $event->getForm()返回子表单SportMeetupType $event->getData

从symfony cookbook中关于动态表单生成()的示例开始

我复制了此代码,但有所不同,我将此表单嵌入到父表单中(为示例
SportPlayerType
而调用)

SportPlayerType
映射到实体
SportPlayer
,该实体包含两个属性:$name和$meetup、一个字符串和一个SportMeetup

我的问题在于lambda函数,addEventListener的参数:

  • $event->getForm()
    返回子表单SportMeetupType
  • $event->getData()
    返回父映射实体SportPlayer
因此,
$form->add('position')
抛出一个错误,因为FormBuilder无法匹配entity SportPlayer上的
position
字段


当SportMeetupType在嵌入表单中时,如何强制SportMeetupType与实体SportMeetupType之间进行匹配?

我们将知道事件被称为
预设置数据的原因

即在设置提交的数据之前触发事件

因此,您无法访问

$event->getData()->getSport();
。。。在监听器中,只要在创建表单时不提供
new Sport()
对象或现有实体,即在如下控制器中:

$entity = new Sport(); // ... or get the entity from db
$form = $this->createForm(new SportMeetupType(), $entity);

只要使用
POST\u SET\u DATA
,数据就会可用。

我通常只使用订户类,所以我不确定这是否是问题所在。侦听器将被调用两次。你应该有一个假设$数据)返回那里。你可以考虑制作一个订阅者类,虽然它不应该有任何区别。你应该能够访问嵌入的表单。code>$form->get('sport')
,假设它就是这个表单所做的。@Flosculus我已经尝试过这个解决方案,但问题不在于表单,而是从
$event->getData()访问的实体。
我尝试过这个:
$player=new SportPlayer()
$player->setSportMeetup(新的SportMeetup())
$form=$this->createForm(新的SportPlayerType(),$player)
但在
PRE_SET_DATA
POST_SET_DATA
事件上的结果是相同的:属性“position”或方法“getPosition()”、“isPosition()”、“hasPosition()”、“u get()”或“u call()”在类“SportPlayer”中都不存在并具有公共访问权限你能确认你的
SportPlayer
类确实有一个方法
getPosition()
返回
$position
属性吗?否。
SportPlayer
有一个方法
getSportMeetup()
返回
SportMeetup
SportMeetup
有一个方法
getposition()
。这就是问题所在,
事件
中的数据是SportPlayer,但是
事件
中的表单映射到SportMeetup上。然后调用
$Event->getData->getSportMeetup()->getPosition()
。。。并确保您拥有
$this->sportMeetup=newsportmeetup()SportPlayer
类的
\u construct()
方法中的code>!在
EventListener
中,我在我的表单
$form->add('position')
中添加了一个新字段时,会发生错误。我知道如何访问
位置
抛出的
SportMeetup
getter,但我如何告诉symfony在表单创建时也这样做?如果我告诉您,作为一种解决方案,我尝试将
位置
字段的
属性路径
设置为
'sportMeetup/position'
,可能会更清楚一些。。。
$entity = new Sport(); // ... or get the entity from db
$form = $this->createForm(new SportMeetupType(), $entity);