Symfony2コントローラーでフォーム値を取得する方法


81

次のコントローラーコードでSymfony2のログインフォームを使用しています

public function loginAction(Request $request)
{
    $user = new SiteUser();
    $form = $this->createForm(new LoginType(), $user);


    if ($request->getMethod() == 'POST') {
        $form->bindRequest($request);
        $data = $form->getValues();
        // Need to do something with the data here
    }

    return $this->render('GDSiteBundle::header.html.twig', array('form' => $form->createView()));
}

しかし、次の警告が表示されます。

警告:array_replace_recursive()[function.array-replace-recursive]:引数#1は\ vendor \ symfony \ src \ Symfony \ Component \ Form \ Form.php行593500内部サーバーエラーの配列ではありません-ErrorException

誰かが私に何が間違っているのか、そしてどうすればそれを修正できるのかを理解するのを手伝ってもらえますか?ありがとう。

更新:小枝ファイルは次のようなものです:

<div class="form">
    {{ form_errors(form) }}
    <form action="{{ path('site_user_login') }}" method="POST" {{ form_enctype(form) }}>
        <div class="level1">
            {{ form_row(form.username) }}
            <a href="javascript:void(0)" id="inscription">{% trans %}Registration{% endtrans %}</a>
        </div>
        <div class="level2">
            {{ form_row(form.pwd_hash) }}
            <div class="forget_pass"><a href="#" id="frgt">{% trans %}Forgot Password ?{% endtrans %}</a></div>
        </div>
        <input type="submit" class="submit" name="login" value/>
        <div class="clr"></div>
    </form>
</div>

フォームのタイプの関数は次のとおりです

public function buildForm(FormBuilder $builder, array $options)
{
    $builder->add('username', 'text', array('label' => 'Username : '));
    $builder->add('pwd_hash','password', array('label' => 'Password : '));
}

ルートは次のとおりです。

site_user_login:
    pattern: /{_locale}/login
    defaults: {_controller: GDSiteBundle:SiteUser:login}

回答:


99

単に:

$data = $form->getData();

1
良い答え-RE:以下の答え。symfonyは多くの場合、同様の結果を得る多くの方法を可能にします。SFソリューションを探すときは、「ベストプラクティス」を調査することをお勧めします。
JustinP 2012

8
新しいバージョンの場合:$ data = $ form-> all();
gmajoulet 2014

92

上記のどれも私のために働いていませんでした。これは私のために働きます:

$username = $form["username"]->getData();
$password = $form["password"]->getData();

お役に立てば幸いです。


2
うーん奇妙なことに、$ request-> request-> get( 'username');で動作するようになりました。リクエストオブジェクトをパラメータとしてアクションに渡しましたか?また、上記にもリクエストクラスを含める必要があります。
VishwaKumar 2012

59

Symfony 2(より具体的には2.3バージョン)では、フィールドのデータを取得できます。

$var = $form->get('yourformfieldname')->getData();

または、すべてのデータを送信することができます

$data = $form->getData();

ここで、「$ data」は、フォームフィールドの値を含む配列です。


20

Symfony> = 2.3では、次の方法で単一フィールドの値を取得できます。

$var = $form->get('yourformfieldname')->getData();

一方、次を使用できます。

$data = $form->getData();

しかし、これはあなたに2つの異なることをもたらすでしょう:

  • フォームでdata-classオプションが有効になっている場合(エンティティにバインドされている場合)、フォームによって値が入力されたエンティティ。これにより、オプションのあるフィールドが除外され'mapping' => falseます

  • それ以外の場合は、すべてのフォームのフィールドを含む配列


18

エンティティで定義されていないフォームに余分なフィールドがあり、$form->getData()機能しない場合、1つの方法は次のようになります。

$request->get("form")["foo"] 

または:

$form->get('foo')->getData();

ありがとうございました!あなたは私の日を救った!

ありがとうございました!これは大いに役立ちました。
madshvero 2016

クエリのIDが必要な場合、それがオブジェクトである場合は、次のコマンドを実行できます。$ form-> get( 'foo')-> getData()-> getId();
juanitourquiza 2018年

あなたの答えに本当に感謝します、それは本当に役に立ちました。
イワンフランコ

5

symfonyフォームには、2つの異なるタイプのトランスフォーマーと3つの異なるタイプの基礎となるデータがあります。 ここに画像の説明を入力してください どのフォームでも、3つの異なるタイプのデータは次のとおりです。

  • モデルデータ

    これは、アプリケーションで使用される形式のデータです(Issueオブジェクトなど)。Form::getData()またはを呼び出すForm::setData()と、「モデル」データを処理していることになります。

  • 規範データ

    これはデータの正規化されたバージョンであり、通常は「モデル」データと同じです(ただし、この例ではありません)。通常、直接使用されることはありません。

  • データを見る

    これは、フォームフィールド自体に入力するために使用される形式です。これは、ユーザーがデータを送信する形式でもあります。を呼び出すForm::submit($data)と、$ dataは「ビュー」データ形式になります。

2つの異なるタイプのトランスフォーマーは、これらのタイプのデータのそれぞれとの間の変換に役立ちます。

  • モデルトランスフォーマー

    transform(): "モデルデータ" => "ノルムデータ"
    reverseTransform(): "ノルムデータ" => "モデルデータ"

  • トランスフォーマーを見る

    transform(): "ノルムデータ" => "ビューデータ"
    reverseTransform(): "ビューデータ" => "ノルムデータ"

どの変圧器が必要かは、状況によって異なります。

ビュートランスフォーマーを使用するには、を呼び出しますaddViewTransformer()


すべてのフォームデータを取得する場合:

$form->getData();

特定のフォームフィールド(たとえばfirst_name)を探している場合:

$form->get('first_name')->getData();


4

私はこれで動作しました:

if ($request->getMethod() == 'POST') {
    $username = $request->request->get('username');
    $password = $request->request->get('password');

    // Do something with the post data
}

関数のパラメーターとしてRequest $ requestも必要です!お役に立てれば。


フォームがsf2フォームビルダーを使用して生成されていない場合、これだけがフォームの値を示し、他のソリューションは示しません。+1メイト
Nikhil Chaudhary 2015

4

フォームオブジェクトによってバインドおよび検証されたリクエストデータを取得するには、次のコマンドを使用する必要があると思います。

$form->getViewData();
$form->getClientData(); // Deprecated since version 2.1, to be removed in 2.3.

これが私が探していたものです。私が取り組んでいるプロジェクトはsymfony2.0であり、更新できません。
ナオミ

3
private function getFormDataArray($form)
{
    $data = [];
    foreach ( $form as $key => $value) {
        $data[$key] = $value->getData();
    }
    return $data;
}

:フォームにサブフォームを持っている場合は、このコードは次のようにする必要があります$data[$key] = is_object($value->getData()) ? $this->getFormDataArray($value) : $value->getData();
Aliance

2

Symfony 2のセキュリティ管理を使用している場合、投稿された値を取得する必要はありません。フォームテンプレートを管理するだけで済みます(ドキュメントを参照)。

Symfony 2のセキュリティ管理を使用していない場合は、使用することを強くお勧めします。したくない場合、またはできない場合は、LoginTypeのソースを教えていただけますか?


ありがとう@BlackCharly私はドキュメントを読み始めています。また、読者が同じように完全に明確になるようにコードを更新しました。あなたの助けに感謝。
VishwaKumar 2012年


0

マップされていないフォームフィールドには、$ form-> get( 'inputName')-> getViewData();を使用します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.