You are here

public function ListDataDefinitionNormalizer::normalize in JSON:API Schema 8

Overrides DataDefinitionNormalizer::normalize

1 call to ListDataDefinitionNormalizer::normalize()
FieldDefinitionNormalizer::normalize in src/Normalizer/FieldDefinitionNormalizer.php
2 methods override ListDataDefinitionNormalizer::normalize()
FieldDefinitionNormalizer::normalize in src/Normalizer/FieldDefinitionNormalizer.php
RelationshipFieldDefinitionNormalizer::normalize in src/Normalizer/RelationshipFieldDefinitionNormalizer.php

File

src/Normalizer/ListDataDefinitionNormalizer.php, line 28

Class

ListDataDefinitionNormalizer
Normalizer for ListDataDefinitionInterface objects.

Namespace

Drupal\jsonapi_schema\Normalizer

Code

public function normalize($list_data_definition, $format = NULL, array $context = []) {
  assert($list_data_definition instanceof ListDataDefinitionInterface);
  $context['parent'] = $list_data_definition;
  $property = $this
    ->extractPropertyData($list_data_definition, $context);
  $property['type'] = 'array';

  // This retrieves the definition common to ever item in the list, and
  // serializes it so we can define how members of the array should look.
  // There are no lists that might contain items of different types.
  $property['items'] = $this->serializer
    ->normalize($list_data_definition
    ->getItemDefinition(), $format, $context);

  // FieldDefinitionInterface::isRequired() explicitly indicates there must be
  // at least one item in the list. Extending this reasoning, the same must be
  // true of all ListDataDefinitions.
  if ($this
    ->requiredProperty($list_data_definition)) {
    $property['minItems'] = 1;
  }
  if (!empty($context['cardinality']) && $context['cardinality'] === 1) {
    $single_property = $property['items'];
    unset($property['items']);
    unset($property['type']);
    unset($property['minItems']);
    $single_property = array_merge($single_property, $property);
    $property = $single_property;
  }
  $normalized = [
    'description' => t('Entity attributes'),
    'type' => 'object',
    'properties' => [],
  ];
  $public_name = $context['name'];
  $normalized['properties'][$public_name] = $property;
  if ($this
    ->requiredProperty($list_data_definition)) {
    $normalized['required'][] = $public_name;
  }
  return $normalized;
}