我正在Symfony2中编写REST API,我让我的控制器使用提供的JsonResponse类输出JSON响应:
$response = new JsonResponse(null, $status);
$response->setData($node['Content']);
return $response;
但是,出于调试目的,能够漂亮地打印输出会很不错。是否有一个参数可以传递给JsonResponse对象以启用输出的漂亮打印?
答案 0 :(得分:5)
为此创建一个事件监听器,就像Pawel的回答是过度设计。
为了美化,你只需通过JSON_PRETTY_PRINT
将JsonResponse
常量传递给setEncodingOptions
,就像在这个例子中一样:
$response = new JsonResponse( [ 'your' => 'data' ] );
$response->setEncodingOptions( $response->getEncodingOptions() | JSON_PRETTY_PRINT );
return $response;
您可以查看Symfony API以获取更多信息:
班级JsonResponse
:
方法setEncodingOptions
:
这是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);