Symfony3 在事件侦听器中获取非映射字段的值

Symfony3 get the value of a non mapped field in event listener

尝试制作一个用户选择选项的表单,并根据他们的选择加载其他字段。到目前为止,我有一个 UserSignupType:

class UserSignupType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('userType', ChoiceType::class, array(
                'choices' => array(
                    "Subscriber" => "Subscriber",
                    "Friend" => "Friend"
                    ),
                'expanded' => true,
                'mapped' => false
                ));

        $builder->addEventListener(
            FormEvents::PRE_SET_DATA,
            function (FormEvent $event) {
                $form = $event->getForm();

                $usertype = $form->get('userType')->getData(); //updated per JBaffords answer

                if($userType == "Subscriber")
                {
                    $builder->add('agency', EntityType::class, array(
                        "class" => "\AppBundle\Entity\Agency",
                        "label" => "name"));
                }
                elseif($userType == "Friend")
                {
                    $builder->add('phoneNumber', PhoneNumberType::class, array(
                        'default_region' => 'US',
                        'format' => PhoneNumberFormat::NATIONAL));
                }
            }
        );
    }

    // ...
}

不确定 getData 方法是否是正确的使用方法,如果是,我需要以某种方式从中获取 "userType" 字段。我不能调用 getUserType 因为它不是实际映射的 属性 而且我不希望它是。它只是决定要显示的字段。

您可以通过以下方式获取任何表单元素(映射或未映射)的值:

$form->get('fieldName')->getData();

get()returns一个Formobject,所以如果你有一个嵌套的表格,你可以在每个[=26上继续调用->get('nextFieldName') =] 直到找到所需的表单元素。

getData 返回的表单值将取决于(除其他外)其 child 元素的映射。如果表格没有children,那么它的值就是它的值;该映射仅确定该值是否填充到其 parent 的数据中。

在您的特定情况下,要获取 userType 元素的数据,您可以:

$userType = $form->get('userType')->getData();