web-dev-qa-db-ja.com

エンティティにバインドされているSymfonyのフォームにバインドされていないフィールドを追加するにはどうすればよいですか?

明らかなことを見逃しているかもしれませんが、エンティティにバインドされている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()」も存在せず、クラス内でパブリックアクセスがあります。

どちらが正しい。これを使用して、ユーザーから追加情報を収集し、エンティティに保存する以外のことを実行したいと思います。

完全にスタンドアロンのフォームを作成する方法は知っていますが、「混合」されたフォームは作成できません。これは可能ですか?

23
tetranz

フォームに、falseproperty_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))

HenrikBjørnskovへの更新情報のクレジット(以下のコメント)

65
fkoessler

Symfony 2.1以降、mappedオプションを使用してください。

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

ドキュメント によると:

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