function ResourceObjectNormalizer::doNormalize

Normalizes an object into a set of arrays/scalars.

Parameters

mixed $object: Object to normalize.

string|null $format: Format the normalization result will be encoded as.

array $context: Context options for the normalizer.

Return value

array|string|int|float|bool|\ArrayObject|null The normalization. An \ArrayObject is used to make sure an empty object is encoded as an object not an array.

Overrides SchematicNormalizerTrait::doNormalize

File

core/modules/jsonapi/src/Normalizer/ResourceObjectNormalizer.php, line 104

Class

ResourceObjectNormalizer
Converts the JSON:API module ResourceObject into a JSON:API array structure.

Namespace

Drupal\jsonapi\Normalizer

Code

public function doNormalize($object, $format = NULL, array $context = []) : array|string|int|float|bool|\ArrayObject|null {
  assert($object instanceof ResourceObject);
  // If the fields to use were specified, only output those field values.
  $context['resource_object'] = $object;
  $resource_type = $object->getResourceType();
  $resource_type_name = $resource_type->getTypeName();
  $fields = $object->getFields();
  // Get the bundle ID of the requested resource. This is used to determine if
  // this is a bundle level resource or an entity level resource.
  if (!empty($context['sparse_fieldset'][$resource_type_name])) {
    $field_names = $context['sparse_fieldset'][$resource_type_name];
  }
  else {
    $field_names = array_keys($fields);
  }
  $normalization_parts = $this->getNormalization($field_names, $object, $format, $context);
  // Keep only the requested fields (the cached normalization gradually grows
  // to the complete set of fields).
  $fields = $normalization_parts[ResourceObjectNormalizationCacher::RESOURCE_CACHE_SUBSET_FIELDS];
  $field_normalizations = array_intersect_key($fields, array_flip($field_names));
  $relationship_field_names = array_keys($resource_type->getRelatableResourceTypes());
  $attributes = array_diff_key($field_normalizations, array_flip($relationship_field_names));
  $relationships = array_intersect_key($field_normalizations, array_flip($relationship_field_names));
  $event = new CollectResourceObjectMetaEvent($object, $context);
  $this->eventDispatcher
    ->dispatch($event);
  $entity_normalization = array_filter($normalization_parts[ResourceObjectNormalizationCacher::RESOURCE_CACHE_SUBSET_BASE] + [
    'attributes' => CacheableNormalization::aggregate($attributes)->omitIfEmpty(),
    'relationships' => CacheableNormalization::aggregate($relationships)->omitIfEmpty(),
    'meta' => count($event->getMeta()) > 0 ? new CacheableNormalization($event, $event->getMeta()) : '',
  ]);
  return CacheableNormalization::aggregate($entity_normalization)->withCacheableDependency($object);
}

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