如何从 symfony 中与表单事件一起显示的字段中获取数据


How to get the data from a field displayed with form events in symfony?

>我正在使用Symfony 3.0

我有一个国家/地区>区域>地区>医疗中心表单类型。所有这些字段都使用 ajax 相互依赖。

我做了四个事件订阅者,每个订阅者都有onPreSetData和onPreSubmit。一切都运行良好,直到我希望在我的控制器中处理提交的数据。

由于没有映射字段,我虽然可以访问提交的值 $form->get("field_name")->getData();

但对于这些字段,这是空的。

如何访问这些字段中提交的值?

这就是我添加字段的方式:

->add('medical_center', MedicalCenterType::class, array(
            'mapped' => false
        ));

医疗中心类型:

class MedicalCenterType extends AbstractType
{
/** @var  EntityManager */
protected $em;
/**
 * @param mixed $em
 * @return $this
 */
public function setEntityManager($em)
{
    $this->em = $em;
    return $this;
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->addEventSubscriber(new AddCountryFieldSubscriber($this->em, 38))
        ->addEventSubscriber(new AddRegionFieldSubscriber($this->em,  38))
        ->addEventSubscriber(new AddLocalityFieldSubscriber($this->em))
        ->addEventSubscriber(new AddMedicalCenterFieldSubscriber($this->em))
    ;
}
}

订阅者:

class AddMedicalCenterFieldSubscriber implements EventSubscriberInterface
    {
        /** @var  EntityManager */
        protected $em;
        /** @var  int */
        protected $locality;
        /** @var  int */
        public $medical_center;
        public function __construct(EntityManager $em, $locality = null)
        {
            $this->em = $em;
            $this->locality = $locality;
        }
        public static function getSubscribedEvents()
        {
            return array(
                FormEvents::PRE_SET_DATA => 'onPreSetData',
                FormEvents::PRE_SUBMIT => 'onPreSubmit'
            );
        }
        public function onPreSetData(FormEvent $event)
        {
           $this->formModifier($event);
        }
        public function onPreSubmit(FormEvent $event)
        {
            $data = $event->getData();
            $this->locality = $data['locality'];
            $this->formModifier($event);
        }
        private function formModifier(FormEvent $event)
        {
            $form = $event->getForm();
            $form->add('medical_center', EntityType::class, array(
                'placeholder' => 'Select a locality first',
                'class' => 'WebsiteBundle:MedicalCenters',
                'query_builder' => function(EntityRepository $er) {
                    return $er->createQueryBuilder('mc')
                        ->where('mc.localities = :locality')
                        ->orderBy('mc.name')
                        ->setParameter('locality', $this->locality);
                },
                'constraints' => new NotBlank(),
                'choice_label' => 'name',
                'mapped'=>false
            ));
        }
    }

我找到了解决方案,它是:

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