我怎样才能在symfony2控制器发送json响应

我正在使用jQuery来编辑我在Symfony中构build的表单。

我在jQuery对话框中显示表单,然后提交它。

数据在数据库中正确input。

但是我不知道是否需要将一些JSON发送回jQuery。 其实我对JSON有点困惑。

假设我用jQuery在表中添加了一行,当我提交表单之后,在提交数据之后,我想发回这些行数据,以便dynamic地添加表格行以显示添加的数据。

我很困惑怎么才能把这些数据拿回来

这是我现在的代码

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

这只是成功消息的模板

Symfony 2.1

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

Symfony 2.2及更高版本

您有特殊的JsonResponse类,它将数组序列化为JSON:

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

但是,如果你的问题是如何序列化实体,那么你应该看看JMSSerializerBundle

假设你已经安装了,你只需要做

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

您还应该检查StackOverflow上的类似问题:

  • 如何在Symfony 2.0 AJAX应用程序中将Doctrine实体编码为JSON?
  • Symfony 2 Doctrine导出为JSON

Symfony 2.1有一个JsonResponse类。

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

传入的数组将被JSON编码,状态码默认为200,内容types将被设置为application / json。

JSONP还有一个方便的setCallback函数。

由于Symfony 3.1可以使用JSON帮手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()); } 

要完成@thecatontheflat答案,我会build议也包装你的行动里面的一个try ... catch块。 这将阻止您的JSON端点中断exception。 这是我使用的骨架:

 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(), ]); } } 

这样,即使在出现错误的情况下,您的端点仍将保持一致,您将能够在客户端对其进行处理。

如果您的数据已经被序列化:

a)发送一个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)发送一个JSONP响应(带callback)

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

如果您的数据需要序列化:

c)发送一个JSON响应

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

d)发送一个JSONP响应(带callback)

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

e)在Symfony 3.xx中使用组

在实体中创build组

 <?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; } // ... } 

在您的应用程序的逻辑中标准化您的Doctrine对象

 <?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('md-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;