在Symfony2中,有没有办法漂亮地打印JSON响应?

时间:2016-02-18 15:55:51

标签: json symfony

我正在Symfony2中编写REST API,我让我的控制器使用提供的JsonResponse类输出JSON响应:

$response = new JsonResponse(null, $status);
$response->setData($node['Content']);
return $response;

但是,出于调试目的,能够漂亮地打印输出会很不错。是否有一个参数可以传递给JsonResponse对象以启用输出的漂亮打印?

2 个答案:

答案 0 :(得分:5)

为此创建一个事件监听器,就像Pawel的回答是过度设计。

为了美化,你只需通过JSON_PRETTY_PRINTJsonResponse常量传递给setEncodingOptions,就像在这个例子中一样:

$response = new JsonResponse( [ 'your' => 'data' ] );
$response->setEncodingOptions( $response->getEncodingOptions() | JSON_PRETTY_PRINT );
return $response;

您可以查看Symfony API以获取更多信息:

这是v3.2的文档...但是像[{1}}这样的旧版本也有此方法。

答案 1 :(得分:2)

您可以为此创建EventListener。这是我的

use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
use Symfony\Component\HttpKernel\HttpKernelInterface;

/**
 * Preetify json response.
 */
class FormatJsonResponseListener
{
    public function onResponse(FilterResponseEvent $event)
    {
        if (HttpKernelInterface::MASTER_REQUEST !== $event->getRequestType()) {
            return;
        }

        $request = $event->getRequest();
        if (APPLICATION_ENV === 'development' || APPLICATION_ENV === 'dev' || $request->query->get('pretty_json', false) == true) {
            $response = $event->getResponse();
            $responseData = $event->getResponse()->getContent();
            $response->setContent(Json::indent($responseData));
            $event->setResponse($response);
        }
    }
}

使用以下方式注册该服务:

#services.ym
services:
    your.service.listener.format_json:
        class: Your\Vendor\FormatJsonResponseListener
        tags:
            - { name: kernel.event_listener, event: kernel.response, method: onResponse }

我的JSON课在这里:https://github.com/sourcefabric/Newscoop/blob/master/newscoop/library/Newscoop/Gimme/Json.php

而是APPLICATION_ENV您可以传递给侦听器参数kernel.debug

您还可以使用(PHP> = 5.4.0,HttpFoundation> = 2.5)修改响应

$response->setEncodingOptions($response->getEncodingOptions() | JSON_PRETTY_PRINT);