Symfony createForm传数组设置ChoiceType默认选中不生效问题咨询
Symfony表单传入数组默认值不生效原因说明
核心原因
你在两个ChoiceType字段的配置里都设置了'mapped' => false,这是问题的根因:
Symfony表单组件的默认逻辑中,mapped参数用于控制字段是否和表单绑定的底层数据(也就是createForm方法传入的第二个参数)做映射:
- 当
mapped设为true(默认值)时,表单会自动从传入的底层数据中读取对应键名的值作为字段默认值,提交时也会把字段值回写到底层数据中 - 当
mapped设为false时,字段会和底层数据完全解耦,既不会从传入的底层数据读取默认值,提交后也不会把值回写到底层数据中
这就是你传入['priority_vu' => $vues, 'priority_article' => $articles]作为底层数据不生效的原因,这两个字段被设置为不映射数据,自然不会读取数组里的值。
为什么setData方法生效
setData是直接对表单字段对象本身赋值,不管字段的mapped配置是什么,都会直接覆盖字段的默认值用于渲染,所以可以正常选中。
替代解决方案(不需要单独调用setData)
如果不想每次都手动调用setData,可以选择以下两种方案之一:
- 把两个字段的
'mapped' => false配置移除或者改为true,即可自动读取传入的底层数据值作为默认值 - 如果需要保留
mapped: false的配置,可以把默认值通过表单选项传入,然后在buildForm方法中给字段设置data配置:
// 控制器传入默认值到表单选项 $form = $this->createForm(ArreteItemOrderType::class, null, [ 'demande_type' => $type, 'default_vu' => $vues, 'default_article' => $articles ]); // 表单类中先配置允许的选项 public function configureOptions(OptionsResolver $resolver): void { $resolver->setDefaults([ 'data_class' => null, 'default_vu' => [], 'default_article' => [], ]); } // buildForm里给字段加data配置 ->add('priority_vu', ChoiceType::class, [ 'choices' => $this->arreteItemRepository->getOrderedPriority('vu', $options['demande_type']), 'choice_label' => 'content', 'choice_value' => 'id', 'mapped' => false, 'multiple' => true, 'data' => $options['default_vu'], // 读取选项里的默认值 'attr' => [ 'class' => 'form-control', 'selected' => true ] ])
内容的提问来源于stack exchange,提问作者barbuslex
相关产品推荐
相关产品推荐

