вернуть JSON в AJAX в Symfony? - PullRequest
18 голосов
/ 02 июня 2010

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

В руководстве Jobeet рассказывается, как вернуть частичное, но я хочу вернуть json, а не частичное.

Ответы [ 4 ]

38 голосов
/ 02 июня 2010

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

return $this->renderText(json_encode($something));
17 голосов
/ 02 июня 2010

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

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

Умнее:

Более разумный способ - создать хороший подкласс sfActions, который помогает обрабатывать json-вещи.

В проекте, который я недавно делал, я создал приложение под названием «api» (./symfony generate:application 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');
    }
  } 
}

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

Итак, мой шаблон 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);
  }
}

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

4 голосов
/ 01 сентября 2012

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

return  new Response(json_encode($data), 200, array('Content-Type', 'text/json'));
0 голосов
/ 26 февраля 2014

Возвращает новый JsonResponse (массив);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...