2012-03-01 13 views
61

私はSymfony 2を使用してプロジェクトを進めています。JSONデータを前後に渡すすべてのデータベースサービスを処理するバンドルを構築しました。Symfony 2へのJSONオブジェクトの投稿

私の問題/質問:

  • それはまっすぐにJSONオブジェクトを投稿することは可能ですか?現在、私は私はそれに名前を与えていない場合、私は$JSON = $request->request->get('json');

  • symfonyのリクエストオブジェクトからデータを取得するように見えることができないオブジェクトに名前json={"key":"value"}を与えることによって、私のAJAX呼び出しのための通常のフォームポストを偽装しています1つのサービスバンドルを使用して、AJAX呼び出しからのデータまたは通常のSymfony形式の両方を処理できるようにします。現在、私はJSON_ENCODEを使ってデータを取得して、提出されたSymfonyフォームを取得していますが、リクエストデータを期待しているサービスコントローラにデータを投稿する仕組みはできません。

    • を私はsymfonyはJSONのポストオブジェクトではなく、フォームを受け入れるようにしたい:要約する

  • は、私はこのことについてつもりならば、すべてが間違っているので、私に教えて気軽にリクエスト/レスポンス

を使用してコントローラ間のJSONオブジェクトを渡したいです!ページの

答えて

120

あなたがリクエストボディに標準JSONとして送信されていますあなたのコントローラ内のデータを検索したい場合は、次のような何かを行うことができます:今

public function yourAction() 
{ 
    $params = array(); 
    $content = $this->get("request")->getContent(); 
    if (!empty($content)) 
    { 
     $params = json_decode($content, true); // 2nd param to get as array 
    } 
} 

$paramsは完全な配列になりますあなたのJSONデータのstdClassオブジェクトを取得するためにjson_decode()コールのtrueパラメータ値を削除します。

+0

応答をありがとう。私は実際に週末このように働いています: $ JSON = file_get_contents( "php:// input"); この方法で問題が発生しましたか? – greg

+17

'php:// input'は1回限りの読み込みです。一度コンテンツを読んだら、そのデータを渡さない限り、再び読むことはできません。 Symfony2 Requestオブジェクトを使うことで、 '$ JSON'変数などを渡すことなく、必要なときにリクエスト中にデータを再度取得できるようになります。 – richsage

+0

説明をありがとう!私はあなたの方法に変更し、それは完全に動作しています。ありがとうございました。 – greg

1

のjavascript:

// products is now filled with a json array 
var products = jQuery('#spreadSheetWidget').spreadsheet('getProducts'); 
var postData = { 
'action': action, 
'products': products 
} 
submitPostForm(jQuery('#submitURLcreateorder').val(), postData); 

コントローラで:

/** 
    * @Route("/varelager/bestilling", name="_varelager_bestilling") 
    * @Template() 
    */ 
    public function bestillingAction(Request $request) { 
     $products = $request->request->get('products', null); // json-string 
     $action  = $request->request->get('action', null); 

     return $this->render(
      'VarelagerBundle:Varelager:bestilling.html.twig', 
      array(
       'postAction' => $action, 
       'products' => $products 
      ) 
     ); 
    } 

テンプレート内(

function submitPostForm(url, data) { 
    var form    = document.createElement("form"); 
     form.action   = url; 
     form.method   = 'POST'; 
     form.style.display = 'none'; 

    //if (typeof data === 'object') {} 

    for (var attr in data) { 
     var param  = document.createElement("input"); 
      param.name = attr; 
      param.value = data[attr]; 
      param.type = 'hidden'; 
     form.appendChild(param); 
    } 

    document.body.appendChild(form); 
    form.submit(); 
} 

( "提出" をクリックのような)いくつかのイベントの後bestilling.html.twig):

{% block resources %} 
     {{ parent() }} 
     <script type="text/javascript"> 
     jQuery(function(){ 
      //jQuery('#placeDateWidget').placedate(); 
      {% autoescape false %} 
      {% if products %} 

      jQuery('#spreadSheetWidget').spreadsheet({ 
       enable_listitem_amount: 1, 
       products: {{products}} 
      }); 
      jQuery('#spreadSheetWidget').spreadsheet('sumQuantities'); 
      {% endif %} 
      {% endautoescape %} 

     }); 
     </script> 
    {% endblock %} 

Alrite、私はそれはあなたがjQuery.ajax()を使用することができますフォームをシミュレートすることなく、何かを送信するために:)

EDIT を望んでいたものだと思います。 ここでは、ページリフレッシュをトリガーしない上記と同じ趣旨の例を示します。

jQuery.ajax({ 
    url:  jQuery('#submitURLsaveorder').val(), 
    data:  postData, 
    success: function(returnedData, textStatus, jqXHR){ 
     jQuery('#spreadSheetWidget').spreadsheet('clear'); 
     window.alert("Bestillingen ble lagret"); 
     // consume returnedData here 

    }, 
    error:  jQuery.varelager.ajaxError, // a method 
    dataType: 'text', 
    type:  'POST' 
}); 
+0

おかげで以下のように私は、このメソッドを使用します!基本的にはまだjavascriptを使った通常のフォームを提出しています。これは私が現時点でやっていることのようなものです。フォームをシミュレートせずに直接JSONオブジェクトを投稿することが可能かどうか疑問に思っていました。 また、SymfonyにJSONオブジェクトがあると、それをRequestオブジェクトとして別のサービスに送信できますか? – greg

+0

私の編集であなたのコメントに対処しました。私はjQueryを使わないでajaxのやり方をする方法があまりよく分からないので、それをあなたに任せてください。誰かを別のコントローラに送るには、そこにリダイレクトすることができます。これについては、http://symfony.com/doc/2.0/book/controller.html * Redirecting * and * Forwarding *に記載されています。がんばろう! –

+0

もう一度ありがとう、私は少し明確にされている必要があります、私は問題をオブジェクトを提出することができます、私はちょうどそれが名前を持っていないコントローラでそれを取得する方法を解決できません – greg

6

私は配列

protected function getContentAsArray(Request $request){ 
    $content = $request->getContent(); 

    if(empty($content)){ 
     throw new BadRequestHttpException("Content is empty"); 
    } 

    if(!Validator::isValidJsonString($content)){ 
     throw new BadRequestHttpException("Content is not a valid json"); 
    } 

    return new ArrayCollection(json_decode($content, true)); 
} 

などのコンテンツを取得するための方法を書いて、迅速な応答のための

$content = $this->getContentAsArray($request); 
$category = new Category(); 
$category->setTitle($content->get('title')); 
$category->setMetaTitle($content->get('meta_title')); 
+1

バリフォードクラスはsymfonyにデフォルトで存在しますか? –

+0

いいえカスタムクラスです –