为表单事件中的某个表单字段添加模型转换器

vid*_*eni 5 forms symfony

我找到的唯一方法是在表单类型的buildForm方法中添加模型转换器,如下面的代码:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $transformer = new IssueToNumberTransformer($entityManager);
    $builder->add(
        $builder->create('issue', 'text')->addModelTransformer($transformer)
    ); 
}
Run Code Online (Sandbox Code Playgroud)

但是我有一个表单字段,当另一个表单字段具有有效值时显示,所以我宁愿在FormEvent::PRE_SET_DATA事件中创建表单字段.

1.一个错误的方式

->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) use ($builder) {
     /** @var $order \VMSP\OrderBundle\Entity\OrderInterface */
     $order = $event->getData();
     $form  = $event->getForm();
     /** @var $serviceType \VMSP\StoreBundle\Entity\ServiceType */
     $serviceType = $order->getServiceType();

     //only home service needs user's address
     if ($serviceType && $serviceType->getType() == ServiceType::TYPE_HOME_SERVICE) {
         //won't work
         $form->add(
             $builder->create('address','hidden')
                     ->addModelTransformer($this->addressTransformer),
             array(
                 'label' => 'vmsp_order.contact.form.address',
             )
         );
    }
}
Run Code Online (Sandbox Code Playgroud)

有人建议

$form->add(
   $builder->create('address', 'hidden')
           ->addModelTransformer($this->addressTransformer),
   array( 'label' => 'vmsp_order.contact.form.address')
);
Run Code Online (Sandbox Code Playgroud)

不幸的是,它抛出了这个错误:

给出"string,integer或Symfony\Component\Form\FormInterface","Symfony\Component\Form\FormBuilder"类型的预期参数

另一种错误的方式

if ($serviceType && $serviceType->getType() == ServiceType::TYPE_HOME_SERVICE) {
    $form->add(
        'address', 
        'hidden', 
        array('label' => 'vmsp_order.contact.form.address')
    );

    $form->get('address')
         ->getConfig()
         ->addModelTransformer($this->addressTransformer);
}
Run Code Online (Sandbox Code Playgroud)

得到错误:

将构建器转换为FormConfigInterface实例后,无法再访问FormConfigBuilder方法.

我列出了上面两种错误的方法,因为我发现有很多帖子说这些方法是对的,当然,它们不是.这篇文章是一个像symfony2-form-events-and-model-transformers这样的问题,但是答案不是我需要的,所以我的问题是,在某个表单字段的表单事件中添加模型转换器的方法是什么?

Raw*_*ner 0

我建议以反向模式进行。配置您的隐藏地址字段,并在必要时将其删除:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $transformer = new IssueToNumberTransformer($entityManager);
    $builder->add(
        $builder->create('issue', 'text')->addModelTransformer($transformer)
    )->add('address','hidden')
     ->addModelTransformer($this->addressTransformer);
}
Run Code Online (Sandbox Code Playgroud)

然后,检查侦听器是否应删除隐藏字段:

 ->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) use ($builder) {
     /** @var $order \VMSP\OrderBundle\Entity\OrderInterface */
     $order = $event->getData();
     $form  = $event->getForm();
     /** @var $serviceType \VMSP\StoreBundle\Entity\ServiceType */
     $serviceType = $order->getServiceType();

     //only home service needs user's address
     if (!$serviceType || $serviceType->getType() != ServiceType::TYPE_HOME_SERVICE) {
         //will work
         $form->remove('address');
    }
}
Run Code Online (Sandbox Code Playgroud)

我想知道为什么第一个错误的方法不起作用?出现什么错误?