2

我正在开发一个我想同时提供 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;
}

这工作正常。如果您发送的 HTTP Accept 标头正好是 application/json,您将返回 JSON。否则,您将获得通常的 hTML 视图。

这工作正常,但我有几十个动作。我宁愿不重复自己。我正在努力将这段代码重构为更通用的东西......但我也想知道这个问题是否已经被现有的 Symfony2 捆绑包解决了。也许带有注释的东西?还是配置设置?到目前为止,我还没有找到任何东西。但是我对 Symfony 太陌生了,我很容易错过一些东西。

4

2 回答 2

2

作为一个通用的想法,如果你想避免使用 3rd 方包,你可以订阅 kernel.response 事件并在那里使用 Response,只是在一个常见的地方。

就像是:

//服务.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 ...
    }
}
于 2014-03-08T22:53:59.743 回答
1

您正在寻找的捆绑包是FOSRestBundle

您可以让它基于 Accept 标头提供 JSON 或将 _format 添加到您的路由......高度可配置。

JMSSerializerBundle一起工作很好。

于 2013-05-23T01:18:57.690 回答