2012-03-01 17 views
61

पर पोस्ट करना मैं सिम्फनी 2 का उपयोग कर एक प्रोजेक्ट पर काम कर रहा हूं, मैंने अपनी सभी डेटाबेस सेवाओं को संभालने के लिए एक बंडल बनाया है जो जेएसओएन डेटा को पीछे और आगे भेजता है।जेएसओएन ऑब्जेक्ट्स को सिम्फनी 2

मेरे समस्या/प्रश्न:

  • यह एक सीधे ऊपर JSON ऑब्जेक्ट पोस्ट करने के लिए संभव है? वर्तमान में मैं वस्तु एक नाम json={"key":"value"} दे रही है अगर मैं इसे एक नाम मैं Symfony अनुरोध वस्तु $JSON = $request->request->get('json');

  • मैं से डेटा प्राप्त नहीं कर पा रहे देना नहीं है के आधार पर अपना ajax कॉल के लिए एक सामान्य रूप पद स्पूफिंग कर रहा हूँ AJAX कॉल, या एक सामान्य सिम्फनी फॉर्म से आने वाले दोनों डेटा को संभालने के लिए एक सेवा बंडल का उपयोग करने में सक्षम होना चाहते हैं। वर्तमान में मैं सबमिट किए गए सिम्फनी फॉर्म को ले रहा हूं, फिर 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 डेटा का। stdClass ऑब्जेक्ट प्राप्त करने के लिए json_decode() पर true पैरामीटर मान हटाएं।

+0

प्रतिक्रिया के लिए धन्यवाद। मुझे वास्तव में सप्ताहांत में इस तरह से काम करना पड़ा: $ JSON = file_get_contents ("php: // input"); इस तरह से कोई समस्या है? – greg

+17

'php: // input' केवल एक बार पढ़ा जाता है। सामग्री को पढ़ने के बाद, यह तब तक पढ़ने के लिए उपलब्ध नहीं है जब तक कि आप उस डेटा को पास न करें। Symfony2 अनुरोध ऑब्जेक्ट का उपयोग करना सुनिश्चित करता है कि आप अनुरोध के दौरान फिर से डेटा प्राप्त कर सकते हैं, जैसे कि आपके '$ JSON' परिवर्तक को पास किए बिना। – richsage

+0

स्पष्टीकरण के लिए धन्यवाद! मैंने आपकी विधि में बदल दिया है और यह पूरी तरह से काम कर रहा है। धन्यवाद। – greg

1

जावास्क्रिप्ट:

// 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 उपयोग कर सकते हैं() एक रूप का अनुकरण के बिना कुछ भेजने के लिए है। यहां एक ही भावना में एक उदाहरण दिया गया है जो ऊपर पृष्ठ को रीफ्रेश नहीं करेगा।

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

तेजी से प्रतिक्रिया के लिए धन्यवाद इस विधि का उपयोग! अनिवार्य रूप से आप अभी भी जावास्क्रिप्ट के साथ एक सामान्य रूप सबमिट कर रहे हैं, इस तरह मैं इस समय क्या कर रहा हूं, मैं सोच रहा था कि क्या कोई नाटक नहीं होने पर, फ़ॉर्म को अनुकरण किए बिना JSON ऑब्जेक्ट को सीधे पोस्ट करना संभव था या नहीं। इसके अलावा, एक बार जब मेरे पास सिम्फनी में JSON ऑब्जेक्ट हो, तो क्या यह अनुरोध ऑब्जेक्ट के रूप में किसी अन्य सेवा को भेजना संभव है? – greg

+0

मैंने अपने संपादन में आपकी टिप्पणी को संबोधित किया। मुझे यकीन नहीं है कि jQuery के बिना AJAX सामान कैसे करें, इसलिए बीमार आपको छोड़ दें। किसी को किसी अन्य नियंत्रक को भेजने के लिए आप उन्हें वहां रीडायरेक्ट कर सकते हैं। यह * रीडायरेक्टिंग * और * फॉरवर्डिंग * के अंतर्गत http://symfony.com/doc/2.0/book/controller.html में शामिल है। सौभाग्य! –

+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

वैधता वर्ग डिफ़ॉल्ट रूप से सिम्फनी पर मौजूद है? –

+0

नहीं, यह कस्टम वर्ग है –