一尘不染

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

php

按照此答案中的建议,我的应用程序当前使用构造函数将数据传递到表单类型。但是,Symfony2.8升级指南建议不要将类型实例传递给createForm函数:

将类型实例传递给Form :: add(),FormBuilder :: add()和FormFactory :: create
*()方法已过时,在Symfony 3.0中不再受支持。而是传递类型的标准类名。

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

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

看来我无法使用完全合格的类名传递数据,还有其他选择吗?


阅读 268

收藏
2020-05-29

共1个答案

一尘不染

这也破坏了我们的某些形式。我通过将自定义数据通过选项解析器传递来修复了该问题。

在您的表单中输入:

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

    $builder
        ->add('name', TextType::class, ['label' => 'L_PROFILE_EDIT_NAME', 'required' => false])
        ...
        ->add('figure_type', ChoiceType::class, [
            'label' => 'L_PROFILE_EDIT_FIGURETYPE',
            'mapped' => false,
            'choices' => $this->traitChoices['figure_type']
        ])
        ...
    ;
}

/**
 * {@inheritdoc}
 */
public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults(array(
        'data_class' => 'Foo\BarBundle\Entity\Profile',
        'trait_choices' => null,
    ));
}

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

$form = $this->createForm(ProfileEditType::class, $profile, array(
        'action' => $this->generateUrl('profile_update'),
        'method' => 'PUT',
        'trait_choices' => $traitChoices,
    ));
2020-05-29