2010-06-01 10 views

cevap

38

, ben geçmişte bir yerlerde aşağıdaki kullandım düşünüyorum Symfony'nin 2.x durumunda "hızlı ve kirli "yol böyle görünüyor:

return new Response(json_encode($data), 200, array('Content-Type', 'text/json')); 
+8

Devre modunda web hata ayıklama çubuğuna sahipseniz, sfConfig :: set ('sf_web_debug', false) satırını eklemelisiniz; – chiborg

+6

Bu, json'u yanıt gövdesine döndürecektir, ancak içerik türü metin/html olacaktır. '$ This-> getResponse() -> setContentType ('application/json') 'nı ekleyin;' – ilanco

17

ucuz yolu:

function executeSomethingThatReturnsJson(){ 
    $M = new Model(); 
    $stuff = $M->getStuff(); 
    echo json_encode($stuff); 
    die(); //don't do any view stuff 
} 

akıllı yol:

daha akıllı bir yol json-malzeme taşıma yardımcı sfActions güzel alt sınıfını yaratmaktır. Geçenlerde yaptığımız bir projede

, ben 'api' ( ./symfony generate:application api)

adında bir uygulama oluşturulan ve daha sonra böyle bir dosya oluşturdum:

API/lib/apiActions.class.php

<?PHP 
class apiActions extends sfActions { 
    public function returnJson($data){ 
    $this->data = $data; 
    if (sfConfig::get('sf_environment') == 'dev' && !$this->getRequest()->isXmlHttpRequest()){ 
     $this->setLayout('json_debug'); 
     $this->setTemplate('json_debug','main'); 
    }else{ 
     $this->getResponse()->setHttpHeader('Content-type','application/json'); 
     $this->setLayout('json'); 
     $this->setTemplate('json','main'); 
    } 
    } 
} 

Şablonu orada açıkça belirlediğime dikkat edin.

Yani benim jsonSuccess.php şablon basitçe:

<?PHP var_dump($data); ?> 

Sonra yerine olağan sfActions arasında (apiActions uzanan bir denetleyici sahip olabilir:

json_debugSuccess.php güzel şeyler yapar
<?PHP echo json_encode($data); 

iken): şunun gibi görünüyor:

Yasal Uyarı: Yukarıdaki kod kopyadır/sahip olduğum bir uygulamadan yapıştırıldı, ancak basitleştirildi. Sadece açıklama amaçlıdır - ama sizi doğru yöne yönlendirmelisiniz.

return $this->renderText(json_encode($something)); 
+0

bu gerçekten çok komik :) çok fazla kod yayınladı ama önceki cevap bir satırdı ve işe yaradı :) 1+ için de olsa yardım etmek için hevesli olmak :) :) –

+6

Doğru - diğer cevap daha güzel bir versiyon "ucuz yol". Cevabımın geri kalanı, çevreye göre farklı şeyler ele almakla ilgili olsa da, çok daha temiz bir şekilde yapılabileceğine eminim. – timdev

4

Bilginize: Eğer onu getiriyorduk sadece normal AJAX eylem ise

+1

Hatta rotanız iyi formatı belirtiyorsa '' Response (json_encode ($ data)) koyabilirsiniz. {_controller: sizin: action, _format: json} ') –

0

Yeni JsonResponse (array);