2012-03-01 19 views
61

Symfony 2'yi kullanarak bir proje üzerinde çalışıyorum, JSON verilerini geri ve ileriye taşıyan tüm veritabanı hizmetlerimi işlemek için bir paket oluşturdum.JSON nesnelerini Symfony'ye kaydetme

My Problem/Soru:

  • düz bir yukarı JSON nesnesi göndermek mümkün mü? Şu anda ben o ben Symfony'nin istek nesnesi $JSON = $request->request->get('json');

  • ben veri almak gibi olamaz bir isim vermezsen nesneye bir ad json={"key":"value"} vererek benim ajax aramalar için normal bir biçim yazı aldatıp ediyorum AJAX çağrılarından veya normal Symfony formlarından gelen verileri işlemek için bir hizmet paketini kullanabilmek ister. Şu anda gönderilen Symfony formunu alıyorum, verileri daha sonra JSON_ENCODE kullanarak alıyorum, sadece veriyi, istek verilerini bekleyen servis denetleyicime nasıl göndereceğimi bilemiyorum.

Özetlemek gerekirse:
  • Ben Symfony'nin bir JSON sonrası nesnesi yerine bir formu kabul etmek istiyorum.

  • Ben bu konuda gidiyorsam tüm yanlış, bu yüzden söyle çekinmeyin İstek/Yanıtı

kullanarak denetleyicileri arasında JSON nesnesi geçmek istiyorum! sayfadaki

cevap

120

istek vücuttaki standart JSON olarak gönderilmiş olmasına controller içerisinde veri almak istiyorsanız, aşağıdakine benzer bir şey yapabilirsiniz:

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

Şimdi $params tam bir dizi olacak JSON verilerinizin. stdClass nesnesini almak için json_decode() aramasındaki true parametre değerini kaldırın.

+0

Yanıt için teşekkürler. Aslında hafta sonu bu şekilde çalışıyor: $ JSON = file_get_contents ("php: // input"); Herhangi bir sorun bu şekilde mi yapıyor? – greg

+17

'php: // input' yalnızca bir kerelik bir okumadır. İçeriği okuduktan sonra, bu verileri iletmediğiniz sürece tekrar okunamaz. Symfony2 Request nesnesinin kullanılması, örneğin $ JSON değişkeninizi etrafa çevirmeden, ihtiyacınız olduğunda bir verinin tekrar tekrar alınabilmesini sağlar. – richsage

+0

Açıklama için teşekkürler! Metodunu değiştirdim ve mükemmel çalışıyor. Teşekkür ederim. – 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); 

denetleyicisi:

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

şablonunda (

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(); 
} 

("Gönder" konulu bir tıklama gibi) bazı olaydan sonra Benim durumumda 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, bunun ne istediğini :)

DÜZENLEMEYİ Eğer jQuery.ajax kullanabilirsiniz() form simülasyonu olmadan bir şeyler göndermek için olduğunu düşünüyorum. Burada, sayfa yenilemeyi tetiklemeyecek olan yukarıdaki aynı ruhla ilgili bir örnek var.

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

Teşekkür gösterildiği gibi bu yöntemi kullanmak! Aslında javascript ile normal bir form gönderiyorsunuz, şu anda yaptığım şeyden bir tanesi, JSON nesnesinin bir drama yapmadan bir form simüle etmeden doğrudan yayınlanmasının mümkün olup olmadığını merak ediyordum. Ayrıca, Symfony'de JSON nesnesine sahip olduğumda, başka bir hizmete Request nesnesi olarak göndermek mümkün mü? – greg

+0

Yorumunuzu düzenlememde ele aldım. Ben jQuery olmadan ajax şeyler yapmak nasıl emin değilim, bu yüzden size bunu hasta bırakın. Birisini başka bir kumandaya göndermek için onları oraya yönlendirebilirsiniz. Bu, http://symfony.com/doc/2.0/book/controller.html adresinde * Yönlendirme * ve * Yönlendirme * altında ele alınmıştır. İyi şanslar! –

+0

Tekrar teşekkür ederim, biraz daha açık olmalıyım, nesneyi problemsiz gönderebilirim, denetleyicide nasıl bir isim alamıyorum ki, – greg

6

Ben dizide

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

gibi içerik almak için yöntem yazdı Ve

altında hızlı yanıt için
$content = $this->getContentAsArray($request); 
$category = new Category(); 
$category->setTitle($content->get('title')); 
$category->setMetaTitle($content->get('meta_title')); 
+1

Değerleme sınıfı varsayılan olarak symfony'de var mı? –

+0

no özel sınıf –

İlgili konular