如何在symfony2控制器中发送JSON响应
How can I send JSON response in symfony2 controller
我正在使用jQuery
编辑在Symfony
中构建的表单。
我在jQuery
对话框中显示表格,然后提交。
数据在数据库中输入正确。
但我不知道是否需要将一些JSON
发送回jQuery
。事实上,我对JSON
有点困惑。
假设我用`jQuery在表中添加了一行,当我提交表单时,在提交数据后,我想发回这些行数据,这样我就可以动态添加表行来显示添加的数据。
我很困惑如何才能取回这些数据。
这是我当前的代码:
$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条令导出到JSON
Symfony 2.1有一个JsonResponse类。
return new JsonResponse(array('name' => $name));
传入的数组将是JSON编码的,状态代码将默认为200,内容类型将设置为application/JSON。
JSONP还有一个方便的setCallback
函数。
由于Symfony 3.1,您可以使用JSON Helperhttp://symfony.com/doc/current/book/controller.html#json-辅助
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());
}
要完成@thecaton.flat答案,我建议您也将操作封装在try … catch
块中。这将防止JSON端点在异常时中断。这是我使用的骨架:
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响应(带回调)
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响应(带回调)
public function someAction()
{
$response = new JsonResponse();
$response->setData([some array]);
$response->setCallback('FUNCTION_CALLBACK_NAME');
return $response;
}
e) 使用Symfony 3.x.x 中的组
在实体内部创建组
<?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;
}
// ...
}
在应用程序的逻辑中规范您的条令对象
<?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 5,它会起作用。
$data = $serializer->serialize(array('key' => 'value'), JsonEncoder::FORMAT);
return new JsonResponse($data, Response::HTTP_OK, [], true);
- 在不同的javascript数组中对json响应进行排序
- Laravel数据表无效的JSON响应
- 使用Backbone.js访问JSON响应的部分
- 不需要的JSON响应
- 跨多个域的json响应
- 将对Ajax PUT的json响应重定向到要由EL解析的JSP中
- handler没有为JSON响应正确填充模板
- 如何在phonegap应用程序中处理Ajax json响应
- 将JSON响应放入var中并输出
- 如何使用AngularJS将if语句conditon与json响应一起使用
- JS-通用解析JSON响应
- 将json响应格式化为父级和子级
- 从 JSON 响应解析数据
- 单个和多个 JSON 响应
- 将日期作为从 Web API 到 angularJS 的 json 响应
- 在 JSX Render for React.js 中遍历 JSON 响应
- 使用 JavaScript 从 URL 获取 JSON 响应
- 使用来自AngularJS的Web API JSON响应-错误:应为和数组,但得到了一个对象
- 生成动态json响应的Javascript
- 如何将json响应的一部分转换为map