Symfony动态表单中FormEvent监听子字段时如何获取父表单其他字段值
问题原因
你无法获取到typeEvent字段值的核心原因是:单个字段触发POST_SUBMIT事件时,Symfony还未完成所有提交数据到底层关联实体的映射,此时父表单调用getData()返回的是尚未填充新提交值的原始实体对象,因此对应属性都是null。
解决方案
方案1:直接从表单字段实例取数(最小改动适配现有代码)
不要从父表单的实体对象取值,直接从父表单的对应字段获取已提交的最新值,修改监听部分代码即可:
$builder->get('start')->addEventListener( FormEvents::POST_SUBMIT, function (FormEvent $event) use ($formModifier) { $start = $event->getForm()->getData(); // 直接从父表单的typeEvent字段取最新提交值,不要从实体取 $type = $event->getForm()->getParent()->get('typeEvent')->getData(); $formModifier($event->getForm()->getParent(), $start, $type); } ); $builder->get('typeEvent')->addEventListener( FormEvents::POST_SUBMIT, function (FormEvent $event) use ($formModifier) { $type = $event->getForm()->getData(); // 直接从父表单的start字段取最新提交值 $start = $event->getForm()->getParent()->get('start')->getData(); $formModifier($event->getForm()->getParent(), $start, $type); } );
方案2:监听父表单PRE_SUBMIT事件(逻辑更统一)
如果不想给两个字段分别加监听,可以直接监听父表单的PRE_SUBMIT事件,一次性拿到所有提交的原始数据,逻辑更集中:
$builder->addEventListener( FormEvents::PRE_SUBMIT, function (FormEvent $event) use ($formModifier) { $data = $event->getData(); $start = isset($data['start']) ? new DateTime($data['start']) : null; $type = null; if (isset($data['typeEvent'])) { // 按typeEvent实际类型转换值,枚举/实体分别适配即可 $type = $event->getForm()->get('typeEvent')->getConfig()->getOption('class')::from($data['typeEvent']); } $formModifier($event->getForm(), $start, $type); } );
额外注意
前端需要保证date和typeEvent任意一个字段值变化时,都触发表单的异步提交来更新seller选项,避免出现两个字段都修改后其中一个监听未触发、seller选项更新不及时的问题。
内容的提问来源于stack exchange,提问作者winnery
相关产品推荐
相关产品推荐

