根据同级 FormType 的数据动态设置 FormType 的选项? 让 FormType 根据同级表单类型的值动态设置自己的选项的模式是什么?

问题描述

我有一个带有自定义 ChoiceType 的 Symfony 表单,它需要根据另一个字段的值(同一表单中的同级表单类型)过滤可用选项。

我使用的 EasyAdmin CMS 不允许其字段将额外的动态 type_options 传递给它们的表单类型 because of it YAML configuration。我希望自定义 ChoiceFormType 封装有关如何解决其自身选项的逻辑。

但是根据其他表单数据修改选项似乎是不可能的。

  • 表单数据在NULL里面是buildForm();我只能从 FormEvents 访问它。
  • FormEvents::PRE_SET_DATA 中,我无法将当前类型替换为具有修改选项的类型。
public function buildForm(FormBuilderInterface $builder,array $options)
{
    $builder->addEventListener(FormEvents::PRE_SET_DATA,function (FormEvent $event) use ($builder,$options) {
        $parent = $event->getForm()->getParent();
        $parent_data = $parent-getData();
        $other_field_value = $parent_data->getotherFieldValue();
        $filtered_choices = array_filter(fn($choice) => $choice !== $other_field_value);
        $options['choices'] = $filtered_choices;

        $parent->add($form,get_class($this),$options);   // THIS FAILS
    }

尝试设置基于表单数据动态解析的选项失败:

检测到一个循环。 PRE_SET_DATA 事件的侦听器不得调用 setData()。您应该改为在 FormEvent 对象上调用 setData()。

$event->setData() 仅适用于当前 FormType,而不适用于整个表单。

让 FormType 根据同级表单类型的值动态设置自己的选项的模式是什么?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)