Как добавить несвязанное поле в форму в Symfony, которая в противном случае связана с сущностью?

Возможно, мне не хватает очевидного, но как мне (или я могу) добавить дополнительное "несвязанное" поле в форму Symfony, которая иначе привязана к сущности?

Скажем, у меня есть объект с полями first_name и last_name. Я делаю типичную вещь в своем методе класса buildForm.

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

и это в моем контроллере:

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

Это работает хорошо, но я хотел бы добавить еще одно текстовое поле, называть его "лишним" и получать значение в действии POST. Если я делаю $builder->add('extra')‍, он жалуется, что

NoSuchPropertyException в строке PropertyAccessor.php 479:

Ни свойство "extra", ни один из методов "getExtra()", "extra()", "isExtra()", "hasExtra()", "__get()" не существуют и имеют открытый доступ в классе...

Это правильно. Я просто хочу использовать его для сбора дополнительной информации от пользователя и делать что-то с ним, кроме сохранения его с сущностью.

Я знаю, как сделать полностью автономную форму, но не "смешанную". Возможно ли это?

Ответы

Ответ 1

В вашей форме добавьте текстовое поле с ложным свойством property_path:

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

Затем вы можете получить доступ к данным в контроллере:

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

UPDATE

Новый способ, с помощью которого Symfony 2.1 использовать параметр mapped и установить его на false.

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

Кредиты для информации об обновлении Henrik Bjørnskov (комментарий ниже)

Ответ 2

С Symfony 2.1 используйте опцию mapped:

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

Ответ 3

В соответствии с Документация:

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;
    }
}