/** * @param Request $request * @param SymfonyResponse $response * @param ResponseModel $responseModel * @return JsonResponse|SymfonyResponse */ protected function serialize(Request $request, SymfonyResponse $response, ResponseModel $responseModel) { switch ($request->getRequestFormat()) { case Format::FORMAT_XML: $response->setContent($this->getSerializedContent($request, $responseModel)); break; default: $headers = $response->headers; $response = new JsonResponse($this->getSerializedContent($request, $responseModel), $response->getStatusCode()); $response->headers = $headers; // some headers might mess up if we pass it to the JsonResponse break; } return $response; }
/** * converts content to correct output format * * @param FilterResponseEvent $event */ public function onResponse(FilterResponseEvent $event) { if (!$this->isActive($event)) { return; } $request = $event->getRequest(); $response = $event->getResponse(); $content = $response->getContent(); // convert content to content container if (!$content instanceof ResponseContainer) { $content = ResponseContainer::createAutoDetect($response); } // override http status code if needed $statusCode = $content->getStatusCode(); if (!empty($statusCode)) { $response->setStatusCode($content->getStatusCode()); } // set 204 header for empty content if ($content->isEmpty() && !$response->isRedirect()) { $response->setStatusCode(Response::HTTP_NO_CONTENT); $content->setStatusCode(Response::HTTP_NO_CONTENT); } // put statusCode in response and force 200 OK in header? if ($request->headers->has('X-Force-Status-Code-200') || $request->getRequestFormat() == self::FORMAT_JSON && $request->query->has('callback')) { $content->setReturnStatusCode(true); $response->setStatusCode(Response::HTTP_OK); $response->headers->set('X-Status-Code', Response::HTTP_OK); } // serialize content container try { $context = new SerializationContext(); $context->setSerializeNull(true); $format = $event->getRequest()->getRequestFormat(); $contentSerialized = $this->serializer->serialize($content->toArray(), $format, $context); switch ($format) { case self::FORMAT_XML: $response->setContent($contentSerialized); break; default: $headers = $response->headers; $response = new JsonResponse(null, $response->getStatusCode()); $response->headers = $headers; $response->setContent($contentSerialized); break; } } catch (\Exception $e) { $response = new JsonResponse(['error' => ['code' => 'error.api.middleware', 'message' => $e->getMessage()]]); } // force empty output on a no-content response if ($content->isEmpty() && $response->isEmpty()) { $response->setContent(''); } $event->setResponse($response); }