function EntityReferenceItemNormalizer::normalize

Same name and namespace in other branches
  1. 8.9.x core/modules/hal/src/Normalizer/EntityReferenceItemNormalizer.php \Drupal\hal\Normalizer\EntityReferenceItemNormalizer::normalize()

Overrides FieldItemNormalizer::normalize

File

core/modules/hal/src/Normalizer/EntityReferenceItemNormalizer.php, line 66

Class

EntityReferenceItemNormalizer
Converts the Drupal entity reference item object to HAL array structure.

Namespace

Drupal\hal\Normalizer

Code

public function normalize($field_item, $format = NULL, array $context = []) {
  // If this is not a fieldable entity, let the parent implementation handle
  // it, only fieldable entities are supported as embedded resources.
  if (!$this->targetEntityIsFieldable($field_item)) {
    return parent::normalize($field_item, $format, $context);
  }
  /** @var \Drupal\Core\Field\FieldItemInterface $field_item */
  $target_entity = $field_item->get('entity')
    ->getValue();
  // If the parent entity passed in a langcode, unset it before normalizing
  // the target entity. Otherwise, untranslatable fields of the target entity
  // will include the langcode.
  $langcode = $context['langcode'] ?? NULL;
  unset($context['langcode']);
  $context['included_fields'] = [
    'uuid',
  ];
  // Normalize the target entity.
  $embedded = $this->serializer
    ->normalize($target_entity, $format, $context);
  // @todo https://www.drupal.org/project/drupal/issues/3110815 $embedded will
  //   be NULL if the target entity does not exist. Use null coalescence
  //   operator to preserve behavior in PHP 7.4.
  $link = $embedded['_links']['self'] ?? NULL;
  // If the field is translatable, add the langcode to the link relation
  // object. This does not indicate the language of the target entity.
  if ($langcode) {
    $embedded['lang'] = $link['lang'] = $langcode;
  }
  // The returned structure will be recursively merged into the normalized
  // entity so that the items are properly added to the _links and _embedded
  // objects.
  $field_name = $field_item->getParent()
    ->getName();
  $entity = $field_item->getEntity();
  $field_uri = $this->linkManager
    ->getRelationUri($entity->getEntityTypeId(), $entity->bundle(), $field_name, $context);
  return [
    '_links' => [
      $field_uri => [
        $link,
      ],
    ],
    '_embedded' => [
      $field_uri => [
        $embedded,
      ],
    ],
  ];
}

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.