/**
* @param Request $request
* @param Response $response
* @param string $resource
* @param \Closure $callback
* @return Response
*/
public function handle(Request $request, Response $response, $resource, $callback)
{
$accept = $this->negotiator->getBest($request->headers->get('Accept'));
$format = $this->negotiator->getFormat($accept->getValue());
if ($format == 'html') {
$format = 'json';
}
$response->headers->set('Content-Type', $accept->getValue());
try {
$manager = $this->managerFactory->create($resource);
$context = new DeserializationContext();
$context->enableMaxDepthChecks();
$object = null;
$content = $request->getContent();
if (!empty($content)) {
$object = $this->serializer->create($request->isMethod('patch') ? 'doctrine' : 'default')->deserialize($request->getContent(), $manager->getClass(), $format, $context);
}
$data = $this->envelopeFactory->create($callback($manager, $object))->export();
} catch (InvalidException $e) {
$response->setStatusCode(400);
$data = array("code" => 400, "message" => $e->getMessage(), "errors" => $e->getErrors());
} catch (NotFoundException $e) {
$response->setStatusCode(404);
$data = array("code" => 404, "message" => $e->getMessage());
} catch (UnsupportedMethodException $e) {
$response->setStatusCode(405);
$data = array("code" => 405, "message" => $e->getMessage());
} catch (HttpException $e) {
$response->setStatusCode($e->getStatusCode());
$data = array("code" => $e->getStatusCode(), "message" => $e->getMessage());
} catch (\Exception $e) {
$this->logger->critical($e);
$response->setStatusCode(500);
$data = array("code" => 500, "message" => $e->getMessage());
}
$groups = array('Default', 'lemon_rest', 'lemon_rest_' . $resource, 'lemon_rest_' . $resource . '_' . strtolower($request->getMethod()));
if (is_object($data)) {
$groups[] = 'lemon_rest_' . $resource . '_view';
} else {
$groups[] = 'lemon_rest_' . $resource . '_list';
}
$context = SerializationContext::create()->enableMaxDepthChecks();
$context->setGroups($groups);
if ($accept->hasParameter('version')) {
$context->setVersion($accept->getParameter('version'));
}
$output = $this->serializer->create('default')->serialize($data, $format, $context);
$response->setContent($output);
return $response;
}