protected function EntityResource::deserialize in Drupal 10
Same name and namespace in other branches
- 8 core/modules/jsonapi/src/Controller/EntityResource.php \Drupal\jsonapi\Controller\EntityResource::deserialize()
- 9 core/modules/jsonapi/src/Controller/EntityResource.php \Drupal\jsonapi\Controller\EntityResource::deserialize()
Deserializes a request body, if any.
Parameters
\Drupal\jsonapi\ResourceType\ResourceType $resource_type: The JSON:API resource type for the current request.
\Symfony\Component\HttpFoundation\Request $request: The request object.
string $class: The class into which the request data needs to be deserialized.
string $relationship_field_name: The public relationship field name of the data to be deserialized if the incoming request is for a relationship update. Not required for non- relationship requests.
Return value
array An object normalization.
Throws
\Symfony\Component\HttpKernel\Exception\BadRequestHttpException Thrown if the request body cannot be decoded, or when no request body was provided with a POST or PATCH request.
\Symfony\Component\HttpKernel\Exception\UnprocessableEntityHttpException Thrown if the request body cannot be denormalized.
File
- core/
modules/ jsonapi/ src/ Controller/ EntityResource.php, line 830
Class
- EntityResource
- Process all entity requests.
Namespace
Drupal\jsonapi\ControllerCode
protected function deserialize(ResourceType $resource_type, Request $request, $class, $relationship_field_name = NULL) {
assert($class === JsonApiDocumentTopLevel::class || $class === ResourceIdentifier::class && !empty($relationship_field_name) && is_string($relationship_field_name));
$received = (string) $request
->getContent();
if (!$received) {
assert($request
->isMethod('POST') || $request
->isMethod('PATCH') || $request
->isMethod('DELETE'));
if ($request
->isMethod('DELETE') && $relationship_field_name) {
throw new BadRequestHttpException(sprintf('You need to provide a body for DELETE operations on a relationship (%s).', $relationship_field_name));
}
else {
throw new BadRequestHttpException('Empty request body.');
}
}
// First decode the request data. We can then determine if the serialized
// data was malformed.
try {
$decoded = $this->serializer
->decode($received, 'api_json');
} catch (UnexpectedValueException $e) {
// If an exception was thrown at this stage, there was a problem decoding
// the data. Throw a 400 HTTP exception.
throw new BadRequestHttpException($e
->getMessage());
}
try {
$context = [
'resource_type' => $resource_type,
];
if ($relationship_field_name) {
$context['related'] = $resource_type
->getInternalName($relationship_field_name);
}
return $this->serializer
->denormalize($decoded, $class, 'api_json', $context);
} catch (UnexpectedValueException $e) {
throw new UnprocessableEntityHttpException($e
->getMessage());
} catch (InvalidArgumentException $e) {
throw new UnprocessableEntityHttpException($e
->getMessage());
}
}