2010-06-01 29 views

Respuesta

38

Si es sólo una acción normal de AJAX que estés devolverlos de, creo que he usado el siguiente en algún lugar en el pasado:

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

Si tiene la barra de depuración web activa en modo dev, debe agregar la línea "sfConfig :: set ('sf_web_debug', false);" – chiborg

+6

Esto devolverá json en el cuerpo de la respuesta, pero el tipo de contenido será text/html. Agregue '$ this-> getResponse() -> setContentType ('application/json');' – ilanco

17

La forma barata:

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

La manera más inteligente:

Una forma más inteligente es crear un buen subclase de sfActions que ayuda a la manipulación JSON-cosas.

En un proyecto que hice hace poco, he creado una aplicación llamada 'api' (./symfony generate:application api)

y luego crea un archivo como:

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

Observe que establecí explícitamente la plantilla allí.

Así que mi plantilla jsonSuccess.php es simplemente:

<?PHP echo json_encode($data); 

Mientras json_debugSuccess.php hace las cosas más bonitas:

<?PHP var_dump($data); ?> 

, entonces puede tener un controlador que se extiende apiActions (en lugar de los habituales sfActions) que se parece a esto:

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

Descargo de responsabilidad: El código de arriba es copiar/pegado de una aplicación que tengo, pero simplificado. Es sólo para fines ilustrativos, pero debería llevarlo en la dirección correcta.

+0

esto fue muy divertido :) has publicado un montón de códigos, pero la respuesta anterior fue una línea y funcionó :) 1+ para que estés ansioso por ayudar! :) –

+6

Derecha - esa otra respuesta es una versión más agradable de "la manera barata". El resto de mi respuesta se trata de manejar las cosas de forma diferente en función del entorno, aunque estoy seguro de que podría hacerse mucho más limpio. – timdev

4

su información: En caso de Symfony 2.x "rápido y sucio "se ve así:

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

Creo que incluso puede poner 'Response (json_encode ($ data))' si su ruta especifica el buen formato ('por defecto: {_controller: your: action, _format: json} ') –

0

Devuelve la nueva JsonResponse (array);