【问题标题】:How do I add an unbound field to a form in Symfony which is otherwise bound to an entity?如何在 Symfony 中的表单中添加未绑定的字段,否则该字段绑定到实体?
【发布时间】:2016-12-20 02:55:04
【问题描述】:

也许我遗漏了显而易见的东西,但是我如何(或者我可以)向绑定到实体的 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()”都不存在并且在类中具有公共访问权限...

这是正确的。我只是想用它来从用户那里收集一些额外的信息,并用它做一些事情,而不是将它与实体一起存储。

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

【问题讨论】:

标签: symfony symfony-forms symfony-2.1


【解决方案1】:

在您的表单中添加一个带有 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))

Henrik Bjørnskov 的更新信息致谢(下方评论)

【讨论】:

  • 谢谢。我不知道我是怎么错过的。它就在“书”中。
  • Symfony 2.1 的新方法是使用mapped 选项并将其设置为false
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    根据Documentation

    allow_extra_fields

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

    您可以通过启用表单上的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;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2012-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多