symfony3 symfony2 getcontent php javascript json symfony

php - getcontent - ¿Cómo puedo enviar la respuesta json en el controlador symfony2



symfony return xml (5)

Estoy usando jQuery para editar mi formulario que está integrado en Symfony.

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

Los datos ingresan correctamente en la base de datos.

Pero no sé si debo enviar algún 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, deseo enviar esos datos de fila para poder agregar dinámicamente la fila de la tabla para mostrar los datos agregados.

Estoy confundido, ¿cómo puedo recuperar 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''); }

Esta es solo la plantilla con mensaje de éxito


Desde Symfony 3.1 puede usar JSON Helper 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()); }


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

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 forma, su punto extremo se comportará de manera uniforme incluso en caso de error y podrá tratarlos directamente del lado del cliente.


Si sus datos ya están serializados:

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 datos necesitan ser serializados:

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) usar grupos en Symfony 3.xx

Crea grupos dentro de tus 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;


Symfony 2.1 tiene una clase JsonResponse .

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

El conjunto pasado será un código JSON, el código de estado predeterminado será 200 y el tipo de contenido se establecerá en application / json.

También hay una práctica función setCallback para JSONP.


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

Tienes una clase especial JsonResponse , que serializa la matriz a JSON:

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

Pero si su problema es cómo serializar la entidad, entonces debería echar un vistazo a JMSSerializerBundle

Suponiendo que lo tiene instalado, simplemente tendrá que hacer

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

También debe verificar si hay problemas similares en :