Symfony2リクエストオブジェクトのPOST値にアクセスする


93

はい、これは初心者の質問ですが、どこにも答えが見つかりません。Symfony2のコントローラーで、フォームの1つからPOST値にアクセスしたいと思います。私が持っているコントローラーでは:

public function indexAction()
{ 
    $request = $this->get('request');
    if ($request->getMethod() == 'POST') {
        $form = $this->get('form.factory')->create(new ContactType());
        $form->bindRequest($request);
        if ($form->isValid()) {
            $name_value = $request->request->get('name');

残念ながら$name_value何も返されません。何が悪いのですか?ありがとう!

回答:


99

symfony 2.2

このソリューションは2.3以降廃止され、3.0で削除されます。ドキュメントを参照してください

$form->getData();

フォームパラメータの配列を提供します

Symfony2のブックページ162(第12章:フォーム)

[...]場合によっては、クラスなしのフォームを使用して、送信されたデータの配列を取得することもできます。これは実際にはとても簡単です:

public function contactAction(Request $request) {
  $defaultData = array('message' => 'Type your message here');
  $form = $this->createFormBuilder($defaultData)
  ->add('name', 'text')
  ->add('email', 'email')
  ->add('message', 'textarea')
  ->getForm();
  if ($request->getMethod() == 'POST') {
    $form->bindRequest($request);
    // data is an array with "name", "email", and "message" keys
    $data = $form->getData();
  }
  // ... render the form
}

次のように、リクエストオブジェクトを介してPOST値(この場合は「名前」)に直接アクセスすることもできます。

$this->get('request')->request->get('name');

ただし、フォームフレームワークによって変換された後にデータ(通常はオブジェクト)を返すため、ほとんどの場合、getData()メソッドを使用する方が適切です。

フォームトークンにアクセスする場合、は配列から要素を削除する$postData = $request->request->get('contact');ため、問題の答えを使用する必要があります getData()


symfony 2.3

2.3以降handleRequestでは、bindRequest次の代わりに使用する必要があります。

 $form->handleRequest($request);

ドキュメントを参照


4
これはすばらしいことであり、今が最良の答えです。$ form-> getData()が存在しないか、質問したときにドキュメントに記載されていませんでした。
Acyra

4
リクエストデータを最新バージョンのフォームにバインドするには、$ form-> handleRequest($ request);を使用する必要があります。$ form-> submit($ request)の代わりに; おもう。詳細は、symfony.com
doc

127

フォームの投稿の値は、リクエストのフォームの名前で保存されます。たとえばgetName()、ContactType()のメソッドをオーバーライドして「contact」を返す場合は、次のようにします。

$postData = $request->request->get('contact');
$name_value = $postData['name'];

それでも問題が解決しない場合は、var_dump()on $request->request->all()を実行して、すべての投稿の値を確認してください。


2
ありがとうございました。var_dumpが役に立ったので、フォームデータを復元するために完全な名前でこれを攻撃しました。たとえば、$ postData = $ request-> request-> get( 'acme_somebundle_contact_type')
Acyra

1
以下のtimaschewからの回答を参照してください。これは尋ねられたため、Symfony2は新しいメソッドを追加しました:$ form-> getData();
Acyra

2
あなたがオーバーライドした場合getName():、それはハードコードしないで名前に理にかなって$request->request->get($form->getName());
Mezeの

ありがとう..私の時間の多くを節約しました:)乾杯!!
Anjana Silva 14

38

私のために働いたのはこれを使っていた:

$data = $request->request->all();
$name = $data['form']['name'];

これはProblematicが言及したものです。+ @mezeのコメントを参照してください
phpsherpa

17

ParameterBag::get()メソッドには1つのトリックがあります。$deepパラメータを設定してtrue、追加の変数なしで必要なディープネストされた値にアクセスできます。

$request->request->get('form[some][deep][data]', null, true);

また、デフォルト値(get()メソッドの2番目のパラメーター)を設定する可能性もあり、冗長なisset($form['some']['deep']['data'])呼び出しを回避できます。


3番目のパラメーターは非推奨になり、3.0から削除されました。注:深い項目の検索はバージョン2.8以降非推奨になり、3.0で削除されます。github.com/symfony/symfony/blob/...
AL

8

リスト12-34を使用して、フィールドデータにコントローラーでアクセスできます。

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

さらに、マップされていないフィールドのデータを直接変更することもできます:リスト12-35

$form->get('dueDate')->setData(new \DateTime());

164ページのsymfony2の本(2013年10月9日に生成された)


7

マルチパート投稿リクエストのticketNumberパラメータに次の方法でアクセスします。

$data = $request->request->all();
$ticketNumber = $data["ticketNumber"];

1

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

$form->getClientData();


7
getClientDataは非推奨です。getData、getViewData、getNormData ...を使用してください。FormコンポーネントはSF2で本当に厄介です(Javaの世界とクールなRequestDataBinderに触発されるべきです...)
Thomas Decaux

0

リクエストデータを取得するためのsymfony doc

最後に、リクエスト本文とともに送信された生データには、getContent()を使用してアクセスできます。

$ content = $ request-> getContent();


-14

初心者の場合は、オープンソースプロジェクトであるSymfony2へようこそ。多くのことを学びたい場合は、ソースを開くことができます。

「Form.php」から:

getData()getNormData()getViewData()

このファイルで詳細を確認できます。


常にsymfonyの方法を使用し、$ _ POST、$ requestはダーティです
Thomas Decaux

ええ、私は説明が得意ではありません^^しかし、これは、$form->getData();人々が怠惰で少し考えずに解決策を求めていることを確認したものとまったく同じ解決策です;-(
Thomas Decaux
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.