You are here

public function ContentEntityNormalizer::denormalize in Zircon Profile 8

Same name and namespace in other branches
  1. 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\Normalizer

Code

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;
}