Forms 在表单事件中为特定表单字段添加模型转换器

Forms 在表单事件中为特定表单字段添加模型转换器,forms,symfony,Forms,Symfony,我发现唯一有效的方法是在表单类型的buildForm方法中添加model transformer,如下代码所示: public function buildForm(FormBuilderInterface $builder, array $options) { $transformer = new IssueToNumberTransformer($entityManager); $builder->add( $builder->create('is

我发现唯一有效的方法是在表单类型的buildForm方法中添加model transformer,如下代码所示:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $transformer = new IssueToNumberTransformer($entityManager);
    $builder->add(
        $builder->create('issue', 'text')->addModelTransformer($transformer)
    ); 
}
但我有一个表单字段,当另一个表单字段具有有效值时显示,因此我宁愿在
FormEvent::PRE_SET_DATA
event中创建表单字段

1.一条错误的路 有人建议

$form->add(
   $builder->create('address', 'hidden')
           ->addModelTransformer($this->addressTransformer),
   array( 'label' => 'vmsp_order.contact.form.address')
);
不幸的是,它抛出了以下错误:

给定“字符串、整数或Symfony\Component\Form\Form接口”、“Symfony\Component\Form\FormBuilder”类型的参数

2.另一个错误的方法 出现错误:

一旦生成器转换为FormConfigInterface实例,就无法再访问FormConfigBuilder方法


我在上面列出了两种错误的方法,因为我发现很多帖子说这些方法是正确的,当然,它们不是。这篇文章是一个类似的问题,但那个答案不是我需要的,所以我的问题是,有没有办法在表单事件中为某个表单字段添加模型转换器?

我建议以反向模式进行。配置隐藏地址字段,如有必要,请稍后将其删除:

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);
}
然后,在侦听器中检查是否应删除隐藏字段:

 ->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');
    }
}
我想知道为什么第一个错误的方法不起作用?出现哪个错误?

您的“1.一个错误的方法”不起作用,因为
$builder->addModelTransformer()
返回
FormConfigBuilderInterface
,但
$form->add()
需要
FormInterface
(请参阅错误消息)

要使其工作,只需添加
getForm()

$form->add(
    $builder->create('address','hidden')
        ->addModelTransformer($this->addressTransformer)
        ->getForm()   // Creates the form
        ...
 ->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');
    }
}
$form->add(
    $builder->create('address','hidden')
        ->addModelTransformer($this->addressTransformer)
        ->getForm()   // Creates the form
        ...