将数据传递到 Symfony 2.8、3.0 及更高版本中的 buildForm()

2022-08-30 08:00:51

我的应用程序当前使用构造函数将数据传递到我的窗体类型,如本答案中所建议的那样。但是,Symfony 2.8 升级指南建议不推荐将类型实例传递给函数:createForm

将类型实例传递给 Form::add()、FormBuilder::add() 和 FormFactory::create*() 方法已被弃用,在 Symfony 3.0 中将不再受支持。请改为传递该类型的完全限定类名。

Before:    
$form = $this->createForm(new MyType());

After:
$form = $this->createForm(MyType::class);

鉴于我无法使用完全限定的类名传递数据,是否有其他替代方法?


答案 1

这也打破了我们的一些形式。我通过选项解析器传递自定义数据来修复它。

在表单类型中:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $this->traitChoices = $options['trait_choices'];

    $builder
        ...
        ->add('figure_type', ChoiceType::class, [
            'choices' => $this->traitChoices,
        ])
        ...
    ;
}

public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults([
        'trait_choices' => null,
    ]);
}

然后,当您在控制器中创建窗体时,将其作为选项传递,而不是在构造函数中传递:

$form = $this->createForm(ProfileEditType::class, $profile, [
    'trait_choices' => $traitChoices,
]);

答案 2

下面介绍如何将数据传递给使用 Symfony 3 的任何人的嵌入式表单。首先完全按照上面概述@sekl,然后执行以下操作:

在主要表单类型中

使用'entry_options将 var 传递给嵌入的表单'

->add('your_embedded_field', CollectionType::class, array(
          'entry_type' => YourEntityType::class,
          'entry_options' => array(
            'var' => $this->var
          )))

在嵌入的表单类型中

将选项添加到选项解析器

public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults(array(
        'data_class' => 'Yourbundle\Entity\YourEntity',
        'var' => null
    ));
}

访问构建窗体函数中的变量。请记住在生成器函数之前设置此变量。在我的情况下,我需要根据特定的ID过滤选项。

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $this->var = $options['var'];

    $builder
        ->add('your_field', EntityType::class, array(
          'class' => 'YourBundle:YourClass',
          'query_builder' => function ($er) {
              return $er->createQueryBuilder('u')
                ->join('u.entity', 'up')
                ->where('up.id = :var')
                ->setParameter("var", $this->var);
           }))
     ;
}

推荐