gpt4 book ai didi

json - 从 Symfony2 Controller 返回基于 “Accept: application/json” 的 JSON,而不修改每个 Controller 操作

转载 作者:可可西里 更新时间:2023-11-01 16:30:39 27 4
gpt4 key购买 nike

我正在开发一个应用程序,我想提供 JSON 和 HTML 响应。这是一个示例操作方法:

/**
* Lists all Boards entities.
*
* @Route("/", name="boards")
* @Method("GET")
* @Template()
*/
public function indexAction()
{
$em = $this->getDoctrine()->getManager();

$entities = $em->getRepository('ScrumBoardServiceBundle:Boards')->findAll();

$acceptHeader = strtolower($this->getRequest()->headers->get('Accept'));
if ($acceptHeader === 'application/json') {
$serializer = new Serializer(array(new GetSetMethodNormalizer()), array('json' => new
JsonEncoder()));
$response = $serializer->serialize(array('success' => true, 'data' => array(
'entity' => $entities,
)), 'json');
$result = new Response($response, 200, array('Content-Type' => 'application/json'));
} else {
$result = array(
'entities' => $entities,
);
}

return $result;
}

这很好用。如果您发送 完全 application/json 的 HTTP Accept header ,您将返回 JSON。否则,您将获得通常的 hTML View 。

这工作正常,但我有很多 Action 。我宁愿不重复自己。我正在努力将这段代码重构为更通用的东西……但我也想知道这个问题是否已经被现有的 Symfony2 包解决了。也许有注释的东西?还是配置设置?到目前为止我还没有找到任何东西。但我是 Symfony 的新手,很容易遗漏一些东西。

最佳答案

作为一个通用的想法,如果您想避免使用第 3 方 bundle ,您可以订阅 kernel.response 事件并在那里使用 Response,就在一个公共(public)位置。

类似于:

//服务.yml

services:
my.kernel.listener:
class: Acme\Bundle\AppBundle\EventListener\MyKernelListener
tags:
- { name: kernel.event_listener, event: kernel.response, method: onKernelResponse }

//MyKernelListener.php

class MyKernelListener
{
public function onKernelResponse(FilterResponseEvent $event)
{
$response = $event->getResponse();
$request = $event->getRequest();
// ... your logic ...
}
}

关于json - 从 Symfony2 Controller 返回基于 “Accept: application/json” 的 JSON,而不修改每个 Controller 操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16704111/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com