2012-07-30 25 views
81

Estoy usando jQuery para editar mi formulario que está integrado en Symfony.¿Cómo puedo enviar la respuesta json en el controlador symfony2?

Estoy mostrando el formulario en el cuadro de diálogo jQuery y luego enviándolo.

Los datos están ingresando correctamente en la base de datos.

Pero no sé si necesito enviar algo de JSON a jQuery. En realidad, estoy un poco confundido con JSON.

Supongamos que he agregado una fila en mi tabla con jQuery y cuando envío el formulario, luego de enviar los datos quiero enviar esos datos de fila para que pueda agregar dinámicamente la fila de la tabla para mostrar los datos agregados.

estoy confundido cómo pueden obtener esos datos

Este es mi código actual

$editForm = $this->createForm(new StepsType(), $entity); 

$request = $this->getRequest(); 

$editForm->bindRequest($request); 

if ($editForm->isValid()) { 
    $em->persist($entity); 
    $em->flush(); 

    return $this->render('::success.html.twig');    
} 

Esto es sólo la plantilla con el mensaje de éxito

Respuesta

167

Symfony 2,1

$response = new Response(json_encode(array('name' => $name))); 
$response->headers->set('Content-Type', 'application/json'); 

return $response; 

Symfony 2.2 y superior

Tiene especial clase JsonResponse, que serialises matriz para JSON:

return new JsonResponse(array('name' => $name)); 

Pero si su problema es Cómo serializar entidad entonces usted debe tener un vistazo a JMSSerializerBundle

Suponiendo que lo tiene instalado, tendrá sim surcan hacer

$serializedEntity = $this->container->get('serializer')->serialize($entity, 'json'); 

return new Response($serializedEntity); 

También debe comprobar si hay problemas similares en StackOverflow:

+1

Entonces, ¿cómo serializar entidad y enviarlo como una respuesta JSON? He estado buscando eso durante una semana ... http://stackoverflow.com/questions/14798532/symfony2-json-response-returns-weird-utf-characters –

+0

También puede usar Symfony JsonResponse (Symfony \ Component \ HttpFoundation \ JsonResponse) – Kiddo

+0

@Kiddo - ya hay un enlace al documento en la respuesta;) –

53

Symfony 2.1 tiene una clase JsonResponse.

return new JsonResponse(array('name' => $name)); 

El pasado en matriz será JSON codificado el código de estado será por defecto 200 y el tipo de contenido se establecerá en application/json.

También hay una útil función setCallback para JSONP.

9

Para completar la respuesta de @thecatontheflat recomendaría que también envuelva su acción dentro de un bloque try ... catch. Esto evitará que su punto final JSON rompa las excepciones.Aquí está el esqueleto que utilizo:

public function someAction() 
{ 
    try { 

     // Your logic here... 

     return new JsonResponse([ 
      'success' => true, 
      'data' => [] // Your data here 
     ]); 

    } catch (\Exception $exception) { 

     return new JsonResponse([ 
      'success' => false, 
      'code' => $exception->getCode(), 
      'message' => $exception->getMessage(), 
     ]); 

    } 
} 

De esta manera su punto final se comportará consistentemente incluso en caso de errores y usted será capaz de tratarlos bien en un lado del cliente.

7

Si los datos ya se serializa:

a) enviar una respuesta JSON

public function someAction() 
{ 
    $response = new Response(); 
    $response->setContent(file_get_contents('path/to/file')); 
    $response->headers->set('Content-Type', 'application/json'); 
    return $response; 
} 

b) enviar una respuesta JSONP (con devolución de llamada)

public function someAction() 
{ 
    $response = new Response(); 
    $response->setContent('/**/FUNCTION_CALLBACK_NAME(' . file_get_contents('path/to/file') . ');'); 
    $response->headers->set('Content-Type', 'text/javascript'); 
    return $response; 
} 

Si sus necesidades de datos sean serializado:

c) enviar una respuesta JSON

public function someAction() 
{ 
    $response = new JsonResponse(); 
    $response->setData([some array]); 
    return $response; 
} 

d) enviar una respuesta JSONP (con devolución de llamada)

public function someAction() 
{ 
    $response = new JsonResponse(); 
    $response->setData([some array]); 
    $response->setCallback('FUNCTION_CALLBACK_NAME'); 
    return $response; 
} 

e) utilizar grupos de Symfony 3.xx

crear grupos dentro de sus Entidades

<?php 

namespace Mindlahus; 

use Symfony\Component\Serializer\Annotation\Groups; 

/** 
* Some Super Class Name 
* 
* @ORM able("table_name") 
* @ORM\Entity(repositoryClass="SomeSuperClassNameRepository") 
* @UniqueEntity(
* fields={"foo", "boo"}, 
* ignoreNull=false 
*) 
*/ 
class SomeSuperClassName 
{ 
    /** 
    * @Groups({"group1", "group2"}) 
    */ 
    public $foo; 
    /** 
    * @Groups({"group1"}) 
    */ 
    public $date; 

    /** 
    * @Groups({"group3"}) 
    */ 
    public function getBar() // is* methods are also supported 
    { 
     return $this->bar; 
    } 

    // ... 
} 

Normalice su objeto Doctrine dentro de la lógica de su aplicación

<?php 

use Symfony\Component\HttpFoundation\Response; 
use Symfony\Component\Serializer\Mapping\Factory\ClassMetadataFactory; 
// For annotations 
use Doctrine\Common\Annotations\AnnotationReader; 
use Symfony\Component\Serializer\Mapping\Loader\AnnotationLoader; 
use Symfony\Component\Serializer\Serializer; 
use Symfony\Component\Serializer\Normalizer\ObjectNormalizer; 
use Symfony\Component\Serializer\Encoder\JsonEncoder; 

... 

$repository = $this->getDoctrine()->getRepository('Mindlahus:SomeSuperClassName'); 
$SomeSuperObject = $repository->findOneById($id); 

$classMetadataFactory = new ClassMetadataFactory(new AnnotationLoader(new AnnotationReader())); 
$encoder = new JsonEncoder(); 
$normalizer = new ObjectNormalizer($classMetadataFactory); 
$callback = function ($dateTime) { 
    return $dateTime instanceof \DateTime 
     ? $dateTime->format('m-d-Y') 
     : ''; 
}; 
$normalizer->setCallbacks(array('date' => $callback)); 
$serializer = new Serializer(array($normalizer), array($encoder)); 
$data = $serializer->normalize($SomeSuperObject, null, array('groups' => array('group1'))); 

$response = new Response(); 
$response->setContent($serializer->serialize($data, 'json')); 
$response->headers->set('Content-Type', 'application/json'); 
return $response; 
12

Desde Symfony 3.1 se puede utilizar JSON ayudante http://symfony.com/doc/current/book/controller.html#json-helper

public function indexAction() 
{ 
// returns '{"username":"jane.doe"}' and sets the proper Content-Type header 
return $this->json(array('username' => 'jane.doe')); 

// the shortcut defines three optional arguments 
// return $this->json($data, $status = 200, $headers = array(), $context = array()); 
} 
Cuestiones relacionadas