public function ContentEntityNormalizer::denormalize in Drupal 9
Same name and namespace in other branches
- 8 core/modules/hal/src/Normalizer/ContentEntityNormalizer.php \Drupal\hal\Normalizer\ContentEntityNormalizer::denormalize()
Implements \Symfony\Component\Serializer\Normalizer\DenormalizerInterface::denormalize().
Parameters
array $data: Entity data to restore.
string $class: Unused parameter.
string $format: Format the given data was extracted from.
array $context: Options available to the denormalizer. Keys that can be used:
- request_method: if set to "patch" the denormalization will clear out all default values for entity fields before applying $data to the entity.
Return value
\Drupal\Core\Entity\EntityInterface An unserialized entity object containing the data in $data.
Throws
\Symfony\Component\Serializer\Exception\UnexpectedValueException
File
- core/
modules/ hal/ src/ Normalizer/ ContentEntityNormalizer.php, line 126
Class
- ContentEntityNormalizer
- Converts the Drupal entity object structure to a HAL array structure.
Namespace
Drupal\hal\NormalizerCode
public function denormalize($data, $class, $format = NULL, array $context = []) {
// Get type, necessary for determining which bundle to create.
if (!isset($data['_links']['type'])) {
throw new UnexpectedValueException('The type link relation must be specified.');
}
// Create the entity.
$typed_data_ids = $this
->getTypedDataIds($data['_links']['type'], $context);
$entity_type = $this
->getEntityTypeDefinition($typed_data_ids['entity_type']);
$default_langcode_key = $entity_type
->getKey('default_langcode');
$langcode_key = $entity_type
->getKey('langcode');
$values = [];
// Figure out the language to use.
if (isset($data[$default_langcode_key])) {
// Find the field item for which the default_langcode value is set to 1 and
// set the langcode the right default language.
foreach ($data[$default_langcode_key] as $item) {
if (!empty($item['value']) && isset($item['lang'])) {
$values[$langcode_key] = $item['lang'];
break;
}
}
// Remove the default langcode so it does not get iterated over below.
unset($data[$default_langcode_key]);
}
if ($entity_type
->hasKey('bundle')) {
$bundle_key = $entity_type
->getKey('bundle');
$values[$bundle_key] = $typed_data_ids['bundle'];
// Unset the bundle key from data, if it's there.
unset($data[$bundle_key]);
}
$entity = $this->entityTypeManager
->getStorage($typed_data_ids['entity_type'])
->create($values);
// Remove links from data array.
unset($data['_links']);
// Get embedded resources and remove from data array.
$embedded = [];
if (isset($data['_embedded'])) {
$embedded = $data['_embedded'];
unset($data['_embedded']);
}
// Flatten the embedded values.
foreach ($embedded as $relation => $field) {
$field_ids = $this->linkManager
->getRelationInternalIds($relation);
if (!empty($field_ids)) {
$field_name = $field_ids['field_name'];
$data[$field_name] = $field;
}
}
$this
->denormalizeFieldData($data, $entity, $format, $context);
// Pass the names of the fields whose values can be merged.
// @todo https://www.drupal.org/node/2456257 remove this.
$entity->_restSubmittedFields = array_keys($data);
return $entity;
}