如何向Symfony中的表单添加未绑定字段,否则绑定到实体?

时间:2012-10-07 01:25:48

标签: symfony symfony-forms symfony-2.1

也许我错过了显而易见的但我怎么(或者我可以)将一个额外的“未绑定”字段添加到另一个绑定到实体的Symfony表单中?

假设我有一个包含字段first_namelast_name的实体。我在表单类buildForm方法中做了典型的事情。

$builder
    ->add('first_name')
    ->add('last_name')
;

这在我的控制器中:

$editForm = $this->createForm(new MyType(), $entity);

这很好用,但我想添加另一个文本框,让我们称之为“额外”,并在POST操作中接收值。如果我$builder->add('extra')‍,则会抱怨

  

PropertyAccessor.php第479行中的NoSuchPropertyException:

     

属性“extra”和方法“getExtra()”,“extra()”,“isExtra()”,“hasExtra()”,“__ get()”都不存在,并且在课堂上具有公共访问权限...

哪个是对的。我只是想用它来收集用户的一些额外信息,并用它做一些事情,而不是将它存储在实体中。

我知道如何制作一个完全独立的形式,但不是一个“混合”的形式。 这可能吗?

3 个答案:

答案 0 :(得分:59)

在表单中添加一个带有false property_path的文本字段:

$builder->add('extra', 'text', array('property_path' => false));

然后,您可以访问控制器中的数据:

$extra = $form->get('extra')->getData();

<强>更新

自Symfony 2.1以来的新方法是使用mapped选项并将其设置为false

->add('extra', null, array('mapped' => false))

有关HenrikBjørnskov更新信息的信用(下面的评论)

答案 1 :(得分:26)

从Symfony 2.1开始,使用mapped选项:

$builder->add('extra', 'text', [
    'mapped' => false,
]);

答案 2 :(得分:2)

根据Documentation

<强> allow_extra_fields

  

通常情况下,如果您提交的表单中没有配置额外的字段,您将获得&#34;此表单不应包含额外字段。&#34;验证错误。

     

您可以通过在表单上启用allow_extra_fields选项来消除此验证错误。

<强>映射

  

如果您希望在读取或写入对象时忽略该字段,可以将mapped选项设置为false。

class YourOwnFormType extends AbstractType
{
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(
            array(
                'allow_extra_fields' => true
            )
        );
    }

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $form = $builder
            ->add('extra', TextType::class, array(
                'label' => 'Extra field'
                'mapped' => false
            ))
        ;
        return $form;
    }
}
相关问题