function ResourceIdentifier::toResourceIdentifiers

Same name and namespace in other branches
  1. 9 core/modules/jsonapi/src/JsonApiResource/ResourceIdentifier.php \Drupal\jsonapi\JsonApiResource\ResourceIdentifier::toResourceIdentifiers()
  2. 8.9.x core/modules/jsonapi/src/JsonApiResource/ResourceIdentifier.php \Drupal\jsonapi\JsonApiResource\ResourceIdentifier::toResourceIdentifiers()
  3. 10 core/modules/jsonapi/src/JsonApiResource/ResourceIdentifier.php \Drupal\jsonapi\JsonApiResource\ResourceIdentifier::toResourceIdentifiers()

Creates an array of ResourceIdentifier objects.

Parameters

\Drupal\Core\Field\EntityReferenceFieldItemListInterface $items: The entity reference field items from which to create the relationship array.

Return value

self[] An array of new ResourceIdentifier objects with appropriate arity values.

3 calls to ResourceIdentifier::toResourceIdentifiers()
EntityReferenceFieldNormalizer::normalize in core/modules/jsonapi/src/Normalizer/EntityReferenceFieldNormalizer.php
Relationship::createFromEntityReferenceField in core/modules/jsonapi/src/JsonApiResource/Relationship.php
Creates a new Relationship from an entity reference field.
ResourceIdentifier::toResourceIdentifiersWithArityRequired in core/modules/jsonapi/src/JsonApiResource/ResourceIdentifier.php
Creates an array of ResourceIdentifier objects with arity on every value.

File

core/modules/jsonapi/src/JsonApiResource/ResourceIdentifier.php, line 314

Class

ResourceIdentifier
Represents a JSON:API resource identifier object.

Namespace

Drupal\jsonapi\JsonApiResource

Code

public static function toResourceIdentifiers(EntityReferenceFieldItemListInterface $items) {
  $relationships = [];
  foreach ($items->filterEmptyItems() as $item) {
    // Create a ResourceIdentifier from the field item. This will make it
    // comparable with all previous field items. Here, it is assumed that the
    // resource identifier is unique so it has no arity. If a parallel
    // relationship is encountered, it will be assigned later.
    $relationship = static::toResourceIdentifier($item);
    if ($relationship->getResourceType()
      ->isInternal()) {
      continue;
    }
    // Now, iterate over the previously seen resource identifiers in reverse
    // order. Reverse order is important so that when a parallel relationship
    // is encountered, it will have the highest arity value so the current
    // relationship's arity value can simply be incremented by one.
    /** @var \Drupal\jsonapi\JsonApiResource\ResourceIdentifier $existing */
    foreach (array_reverse($relationships, TRUE) as $index => $existing) {
      $is_parallel = static::isParallel($existing, $relationship);
      if ($is_parallel) {
        // A parallel relationship has been found. If the previous
        // relationship does not have an arity, it must now be assigned an
        // arity of 0.
        if (!$existing->hasArity()) {
          $relationships[$index] = $existing->withArity(0);
        }
        // Since the new ResourceIdentifier is parallel, it must have an arity
        // assigned to it that is the arity of the last parallel
        // relationship's arity + 1.
        $relationship = $relationship->withArity($relationships[$index]->getArity() + 1);
        break;

      }
    }
    // Finally, append the relationship to the list of ResourceIdentifiers.
    $relationships[] = $relationship;
  }
  return $relationships;
}

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