public function ContentEntityNormalizer::denormalize in Zircon Profile 8
Same name and namespace in other branches
- 8.0 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, entity_create() is used to instantiate entity objects.
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.
Throws
\Symfony\Component\Serializer\Exception\UnexpectedValueException
Overrides DenormalizerInterface::denormalize
1 method overrides ContentEntityNormalizer::denormalize()
- FileEntityNormalizer::denormalize in core/
modules/ hal/ src/ Normalizer/ FileEntityNormalizer.php - Implements \Symfony\Component\Serializer\Normalizer\DenormalizerInterface::denormalize().
File
- core/
modules/ hal/ src/ Normalizer/ ContentEntityNormalizer.php, line 129 - Contains \Drupal\hal\Normalizer\ContentEntityNormalizer.
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 = array()) {
// 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->entityManager
->getDefinition($typed_data_ids['entity_type']);
$langcode_key = $entity_type
->getKey('langcode');
$values = array();
// Figure out the language to use.
if (isset($data[$langcode_key])) {
$values[$langcode_key] = $data[$langcode_key][0]['value'];
// Remove the langcode so it does not get iterated over below.
unset($data[$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->entityManager
->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 = array();
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;
}
}
// Pass the names of the fields whose values can be merged.
$entity->_restSubmittedFields = array_keys($data);
// Iterate through remaining items in data array. These should all
// correspond to fields.
foreach ($data as $field_name => $field_data) {
$items = $entity
->get($field_name);
// Remove any values that were set as a part of entity creation (e.g
// uuid). If the incoming field data is set to an empty array, this will
// also have the effect of emptying the field in REST module.
$items
->setValue(array());
if ($field_data) {
// Denormalize the field data into the FieldItemList object.
$context['target_instance'] = $items;
$this->serializer
->denormalize($field_data, get_class($items), $format, $context);
}
}
return $entity;
}