jsonapi_extras-8.x-3.16/src/Normalizer/SchemaFieldDefinitionNormalizer.php

src/Normalizer/SchemaFieldDefinitionNormalizer.php
<?php

namespace Drupal\jsonapi_extras\Normalizer;

use Drupal\Component\Utility\NestedArray;
use Drupal\Core\Field\FieldDefinitionInterface;
use Drupal\jsonapi\ResourceType\ResourceTypeRepositoryInterface;
use Drupal\jsonapi_extras\ResourceType\ConfigurableResourceType;
use Drupal\schemata_json_schema\Normalizer\jsonapi\FieldDefinitionNormalizer as SchemataJsonSchemaFieldDefinitionNormalizer;

/**
 * Applies field enhancer schema changes to field schema.
 */
class SchemaFieldDefinitionNormalizer extends SchemataJsonSchemaFieldDefinitionNormalizer {

  /**
   * The JSON:API resource type repository.
   *
   * @var \Drupal\jsonapi\ResourceType\ResourceTypeRepository
   */
  protected $resourceTypeRepository;

  /**
   * Constructs a SchemaFieldDefinitionNormalizer object.
   *
   * @param \Drupal\jsonapi\ResourceType\ResourceTypeRepositoryInterface $resource_type_repository
   *   A resource type repository.
   */
  public function __construct(ResourceTypeRepositoryInterface $resource_type_repository) {
    $this->resourceTypeRepository = $resource_type_repository;
  }

  /**
   * {@inheritdoc}
   */
  public function normalize($field_definition, $format = NULL, array $context = []): array|bool|string|int|float|null|\ArrayObject {
    assert($field_definition instanceof FieldDefinitionInterface);
    $normalized = parent::normalize($field_definition, $format, $context);

    // Load the resource type for this entity type and bundle.
    $bundle = empty($context['bundleId'])
      ? $context['entityTypeId']
      : $context['bundleId'];
    $resource_type = $this->resourceTypeRepository->get($context['entityTypeId'], $bundle);

    if (!$resource_type || !$resource_type instanceof ConfigurableResourceType) {
      return $normalized;
    }

    $field_name = $context['name'];
    $enhancer = $resource_type->getFieldEnhancer($field_definition->getName());
    if (!$enhancer) {
      return $normalized;
    }
    $parents = ['properties', 'attributes', 'properties', $field_name];
    $original_field_schema = NestedArray::getValue($normalized, $parents);
    $to_copy = ['title', 'description'];
    $field_schema = array_merge(
      $enhancer->getOutputJsonSchema(),
      // Copy *some* properties from the original.
      array_intersect_key($original_field_schema, array_flip($to_copy))
    );
    NestedArray::setValue(
      $normalized,
      $parents,
      $field_schema
    );

    return $normalized;
  }

}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc