/** * @SuppressWarnings(PHPMD.UnusedFormalParameter) * * @param Request $request * @param mixed $data * * @return Response * @throws ValidationException */ public function createResponse(Request $request, $data = null) { /** @var RequestMeta $meta */ $meta = $request->attributes->get(RequestMeta::ATTRIBUTE); $operation = $meta->getOperation(); $body = $data === null ? '' : $data; $statusCode = 200; $codes = $operation->getStatusCodes(); $understands204 = in_array(204, $codes); foreach ($codes as $code) { if ('2' == substr((string) $code, 0, 1)) { $statusCode = $code; break; } } $schema = $meta->getOperation()->getResponse($statusCode)->getSchema(); if ($this->validator) { $result = $this->validator->validate($schema, $body); if (!$result->isvalid()) { throw new ValidationException($result->getErrorMessages(), Response::HTTP_INTERNAL_SERVER_ERROR, ValidationException::MESSAGE_OUTPUT); } } if ($body !== '') { $body = $this->hydrator->dehydrate($body, $schema); } elseif ($understands204) { $statusCode = 204; } return new JsonResponse($body, $statusCode); }
/** * @param Request $request * * @throws ValidationException * @throws MalformedContentException */ public function process(Request $request) { if (!$request->attributes->has(RequestMeta::ATTRIBUTE_URI)) { throw new \UnexpectedValueException("Missing document URI"); } $description = $this->repository->get($request->attributes->get(RequestMeta::ATTRIBUTE_URI)); $operation = $description->getPath($request->attributes->get(RequestMeta::ATTRIBUTE_PATH))->getOperation($request->getMethod()); $body = null; if ($request->getContent()) { $body = json_decode($request->getContent()); if (json_last_error() !== JSON_ERROR_NONE) { throw new MalformedContentException(json_last_error_msg()); } } $result = $this->validator->validate($operation->getRequestSchema(), $coercedParams = $this->parametersAssembler->assemble($operation, $request->query->all(), $request->attributes->all(), $request->headers->all(), $body)); foreach ($coercedParams as $attribute => $value) { /** @var ScalarSchema $schema*/ if (($schema = $operation->getParameter($attribute)->getSchema()) instanceof ScalarSchema) { if ($schema->isDateTime()) { $value = $this->dateTimeSerializer->deserialize($value, $schema); } } $request->attributes->set($attribute, $value); } if ($this->hydrator && ($bodyParam = $description->getRequestBodyParameter($operation->getPath(), $operation->getMethod()))) { $body = $this->hydrator->hydrate($body, $bodyParam->getSchema()); $request->attributes->set($bodyParam->getName(), $body); } $request->attributes->set(RequestMeta::ATTRIBUTE, new RequestMeta($description, $operation)); if (!$result->isValid()) { throw new ValidationException($result->getErrorMessages()); } }