Lemon\RestBundle\Request\Handler::handle PHP Method

handle() public method

public handle ( Request $request, Response $response, string $resource, Closure $callback ) : Response
$request Symfony\Component\HttpFoundation\Request
$response Symfony\Component\HttpFoundation\Response
$resource string
$callback Closure
return Symfony\Component\HttpFoundation\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;
    }

Usage Example

 /**
  * @param Request $request
  * @param string $resource
  * @param int $id
  * @return Response
  */
 public function deleteAction(Request $request, $resource, $id)
 {
     $response = $this->response;
     return $this->handler->handle($request, $this->response, $resource, function (ManagerInterface $manager) use($response, $id) {
         $response->setStatusCode(204);
         $manager->delete($id);
     });
 }