Как добавить несвязанное поле в форму в 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 () " не существуют и имеют открытый доступ в классе...

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

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

3 ответов


в вашей форме добавьте текстовое поле с 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))

кредиты для обновления информации Хенрика Бьорнскова (комментарий ниже )


начиная с Symfony 2.1, используйте :

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

По словам документация:

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