2010-06-01 3 views
18

В symfony я вызываю действие, и я хочу, чтобы это возвращало json в интерфейс jQuery.вернуть json в ajax в symfony?

Учебник Jobeet учит возврату частичного, но я хочу вернуть json, а не частичное.

ответ

38

Если это просто обычный AJAX действие вы вернуть его из, я думаю, я использовал следующие где-то в прошлом:

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

Если у вас есть панель веб-отладки, активная в режиме dev, вы должны добавить строку «sfConfig :: set ('sf_web_debug', false); – chiborg

+6

Это вернет json в тело ответа, но тип содержимого будет text/html. Добавьте '$ this-> getResponse() -> setContentType ('application/json');' – ilanco

17

Дешевый способ:

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

Умнее путь:

Умнее способ создать хороший подкласс sfActions, который помогает обработки JSON-материал.

В проекте я сделал недавно, я создал приложение под названием 'апи' (./symfony generate:application api)

, а затем создал файл, как:

API/Библиотека/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'); 
    } 
    } 
} 

Обратите внимание, что я явно устанавливаю шаблон там.

Так что мой шаблон jsonSuccess.php просто:

<?PHP echo json_encode($data); 

Хотя json_debugSuccess.php делает вещи красивее:

<?PHP var_dump($data); ?> 

Тогда вы можете иметь контроллер, который расширяет apiActions (вместо обычных sfActions), который выглядит следующим образом:

<?php 
class myActions extends apiAction { 
    public function executeList(sfWebRequest $request) 
    { 
    $params = array(); 
    if ($request->hasParameter('id')){ 
     $id = $request->getParameter('id'); 
     if (is_numeric($id)){ 
     $params['id'] = $id; 
     } 
    } 
    $data = Doctrine::getTable('SomeTable')->findAll(); 
    $this->returnJson($data); 
    } 
} 

Отказ от ответственности: код, указанный выше, копирует/вклеивается из приложения, которое у меня есть, но упрощено. Это только для иллюстративных целей - но это должно заставить вас двигаться в правильном направлении.

+0

это было действительно смешно :) u отправил много кодов, но предыдущий ответ был одной строкой, и это сработало :) 1+ для того, чтобы вы были готовы помочь хотя! :) –

+6

Правильно - этот другой ответ - более приятная версия «дешевого пути». Остальная часть моего ответа касается обработки вещей по-разному на основе среды, хотя я уверен, что это может быть сделано намного чище. – timdev

4

FYI: В случае Symfony 2.x «быстро и грязный "способ выглядит следующим образом:

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

Я думаю, вы даже можете просто поместить 'Response (json_encode ($ data))', если ваш маршрут указывает хороший формат ('defaults: {_controller: your: action, _format: json} ') –

0

Возврат нового JsonResponse (массив);

Смежные вопросы