web-dev-qa-db-ja.com

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

次のコントローラーコードで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行の配列ではありません593 500内部サーバーエラー-ErrorException

誰かが間違っていることを理解するのを助けてくれますか、どうすれば修正できますか?ありがとう。

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

<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}
78
VishwaKumar

単に:

$data = $form->getData();
92
Hubert Perron

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

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

役に立てば幸いです。

90
pkout

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

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

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

$data = $form->getData();

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

57
albert

Symfony> = 2.3では、以下を使用して単一フィールドの値を取得できます。

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

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

$data = $form->getData();

BUTこれにより、2つの異なる結果が得られます。

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

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

20
Jean

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

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

または :

$form->get('foo')->getData();
15
Saman Mohamadi

Symfony forms には、2つの異なるタイプの transformers と3つの異なるタイプの基礎データがあります: enter image description here どの形式でも、3種類のデータは次のとおりです。

  • モデルデータ

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

  • 標準データ

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

  • データの表示

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

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

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

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

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

    transform(): "norm data" => "view data"
    reverseTransform(): "データの表示" => "標準データ"

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

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


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

$form->getData();

特定のフォームフィールド(たとえば、first_name)の後にいる場合:

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

これでうまくいきました:

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

    // Do something with the post data
}

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

4
VishwaKumar

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

$form->getViewData();
$form->getClientData(); // Deprecated since version 2.1, to be removed in 2.3.
4
Chicna
private function getFormDataArray($form)
{
    $data = [];
    foreach ( $form as $key => $value) {
        $data[$key] = $value->getData();
    }
    return $data;
}
3
viciouskinid

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

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

2
BlackCharly

特定のフィールドのデータを取得するには、

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

または、すべてのフォームデータ

$form->getData();

ドキュメントへのリンク: https://symfony.com/doc/2.7/forms.html

2
PJately

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

0
Strabek