也许我错过了显而易见的但我怎么(或者我可以)将一个额外的“未绑定”字段添加到另一个绑定到实体的Symfony表单中?
假设我有一个包含字段first_name
和last_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()”都不存在,并且在课堂上具有公共访问权限...
哪个是对的。我只是想用它来收集用户的一些额外信息,并用它做一些事情,而不是将它存储在实体中。
我知道如何制作一个完全独立的形式,但不是一个“混合”的形式。 这可能吗?
答案 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)
<强> 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;
}
}