在Symfony中,如何向一个绑定实体的表单中添加一个未绑定字段?

24

也许我没有想到明显的方法,但是我该如何(或者是否可以)向一个绑定到实体的Symfony表单中添加一个额外的“未绑定”字段呢?

假设我有一个带有first_namelast_name字段的实体。我在我的表单类的buildForm方法中按照典型方式操作。

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

并且这是我的控制器中的代码:

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

这个方法很好用,但是我想添加另一个文本框,叫做“extra”,并在POST操作中接收它的值。如果我这样做$builder->add('extra'),它会抱怨:

在PropertyAccessor.php文件的第479行上发生了NoSuchPropertyException异常:

类中没有公共访问符号的“extra”属性、getExtra() 方法、extra() 方法、isExtra() 方法、hasExtra()方法和__get()方法之一...

这是正确的。我只想使用它来从用户那里收集一些额外的信息,并对其进行一些与实体存储不同的处理。

我知道如何创建完全独立的表单,但不知道如何创建“混合”的表单。这可行吗?


1
https://speakerdeck.com/u/bschussek/p/symfony-form-tricks 第55张幻灯片 - AdrienBrault
3个回答

67
在您的表单中添加一个带有false property_path的文本字段:
$builder->add('extra', 'text', array('property_path' => false));

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

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

更新

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

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

感谢Henrik Bjørnskov(下面的评论)提供的更新信息。


谢谢。我不知道我怎么错过了那个。它就在“书”里面。 - tetranz
8
Symfony 2.1的新方法是使用mapped选项并将其设置为false - Henrik Bjørnskov

30

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

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

4
根据文档

allow_extra_fields

通常,如果您提交了未在表单中配置的额外字段,则会收到“此表单不应包含额外字段”的验证错误。

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

mapped

如果希望在读取或写入对象时忽略该字段,则可以将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;
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接