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