2012-03-01 84 views
61

我正在使用Symfony 2進行項目工作,我已經構建了一個捆綁包來處理所有通過JSON數據傳回的數據庫服務。將JSON對象發佈到Symfony 2

我的問題/問題:

  • 是否有可能發佈直線上升JSON對象?目前,我通過給對象的名稱json={"key":"value"}如果我不給它一個名字,我似乎無法得到來自Symfony的請求對象$JSON = $request->request->get('json');

  • 我的數據欺騙一個正常的形式後對我的Ajax調用希望能夠使用一個服務包來處理來自AJAX調用的數據或正常的Symfony表單。目前我正在使用提交的Symfony表單,然後使用JSON_ENCODE獲取數據,但我無法弄清楚如何將數據發佈到預期請求數據的服務控制器。

總結:

  • 我想的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數據。在json_decode()調用中刪除true參數值以獲取stdClass對象。

+0

感謝您的回覆。我實際上是這樣在週末工作的: $ JSON = file_get_contents(「php:// input」); 這樣做有什麼問題嗎? – greg 2012-03-05 18:13:54

+17

'php:// input'是一次性只讀。一旦閱讀完內容,除非您傳遞數據,否則無法再次閱讀。使用Symfony2請求對象確保您可以在請求期間再次獲取數據,而無需傳遞例如'$ JSON'變量。 – richsage 2012-03-05 20:17:21

+0

感謝您的解釋!我改變了你的方法,它的工作完美。謝謝。 – greg 2012-03-05 21:59:32

1

JavaScript的網頁上:在模板

/** 
    * @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 
      ) 
     ); 
    } 

(:

// 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); 

控制器:

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()。 下面是一個與上述相同的例子,它不會觸發頁面刷新。

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 2012-03-01 19:21:24

+0

我在編輯中提到了您的評論。我不太清楚如何在沒有jQuery的情況下做一些Ajax的東西,所以生病的時候留給你。要將某人發送給其他控制器,您可以將其重定向到那裏。這在http://symfony.com/doc/2.0/book/controller.html *重定向*和*轉發*中進行了介紹。祝你好運! – 2012-03-01 20:03:23

+0

再次感謝你,我應該已經更清楚了一點,我可以提交對象沒有問題,我只是不能找出如何在控制器中檢索它,而沒有名稱 – greg 2012-03-01 20:19:49

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中默認存在? – 2017-08-30 11:39:36

+0

不,它是自定義類 – 2017-09-05 11:23:55