class ContentEntityDenormalizer
Converts a JSON:API array structure into a Drupal entity object.
@internal JSON:API maintains no PHP API since its API is the HTTP API. This class may change at any time and this will break any dependencies on it.
Hierarchy
- class \Drupal\serialization\Normalizer\NormalizerBase implements \Symfony\Component\Serializer\SerializerAwareInterface, \Drupal\serialization\Normalizer\CacheableNormalizerInterface, \Symfony\Component\Serializer\Normalizer\CacheableSupportsMethodInterface uses \Symfony\Component\Serializer\SerializerAwareTrait
- class \Drupal\jsonapi\Normalizer\NormalizerBase extends \Drupal\serialization\Normalizer\NormalizerBase
- class \Drupal\jsonapi\Normalizer\EntityDenormalizerBase implements \Symfony\Component\Serializer\Normalizer\DenormalizerInterface extends \Drupal\jsonapi\Normalizer\NormalizerBase
- class \Drupal\jsonapi\Normalizer\ContentEntityDenormalizer extends \Drupal\jsonapi\Normalizer\EntityDenormalizerBase
 
 
 - class \Drupal\jsonapi\Normalizer\EntityDenormalizerBase implements \Symfony\Component\Serializer\Normalizer\DenormalizerInterface extends \Drupal\jsonapi\Normalizer\NormalizerBase
 
 - class \Drupal\jsonapi\Normalizer\NormalizerBase extends \Drupal\serialization\Normalizer\NormalizerBase
 
Expanded class hierarchy of ContentEntityDenormalizer
See also
https://www.drupal.org/project/drupal/issues/3032787
1 string reference to 'ContentEntityDenormalizer'
- jsonapi.services.yml in core/
modules/ jsonapi/ jsonapi.services.yml  - core/modules/jsonapi/jsonapi.services.yml
 
1 service uses ContentEntityDenormalizer
File
- 
              core/
modules/ jsonapi/ src/ Normalizer/ ContentEntityDenormalizer.php, line 18  
Namespace
Drupal\jsonapi\NormalizerView source
final class ContentEntityDenormalizer extends EntityDenormalizerBase {
  
  /**
   * {@inheritdoc}
   */
  protected $supportedInterfaceOrClass = ContentEntityInterface::class;
  
  /**
   * Prepares the input data to create the entity.
   *
   * @param array $data
   *   The input data to modify.
   * @param \Drupal\jsonapi\ResourceType\ResourceType $resource_type
   *   Contains the info about the resource type.
   * @param string $format
   *   Format the given data was extracted from.
   * @param array $context
   *   Options available to the denormalizer.
   *
   * @return array
   *   The modified input data.
   */
  protected function prepareInput(array $data, ResourceType $resource_type, $format, array $context) {
    $data_internal = [];
    $field_map = $this->fieldManager
      ->getFieldMap()[$resource_type->getEntityTypeId()];
    $entity_type_id = $resource_type->getEntityTypeId();
    $entity_type_definition = $this->entityTypeManager
      ->getDefinition($entity_type_id);
    $bundle_key = $entity_type_definition->getKey('bundle');
    $uuid_key = $entity_type_definition->getKey('uuid');
    // User resource objects contain a read-only attribute that is not a real
    // field on the user entity type.
    // @see \Drupal\jsonapi\JsonApiResource\ResourceObject::extractContentEntityFields()
    // @todo: eliminate this special casing in https://www.drupal.org/project/drupal/issues/3079254.
    if ($entity_type_id === 'user') {
      $data = array_diff_key($data, array_flip([
        $resource_type->getPublicName('display_name'),
      ]));
    }
    // Translate the public fields into the entity fields.
    foreach ($data as $public_field_name => $field_value) {
      $internal_name = $resource_type->getInternalName($public_field_name);
      // Skip any disabled field, except the always required bundle key and
      // required-in-case-of-PATCHing uuid key.
      // @see \Drupal\jsonapi\ResourceType\ResourceTypeRepository::getFieldMapping()
      if ($resource_type->hasField($internal_name) && !$resource_type->isFieldEnabled($internal_name) && $bundle_key !== $internal_name && $uuid_key !== $internal_name) {
        continue;
      }
      if (!isset($field_map[$internal_name]) || !in_array($resource_type->getBundle(), $field_map[$internal_name]['bundles'], TRUE)) {
        throw new UnprocessableEntityHttpException(sprintf('The attribute %s does not exist on the %s resource type.', $internal_name, $resource_type->getTypeName()));
      }
      $field_type = $field_map[$internal_name]['type'];
      $field_class = $this->pluginManager
        ->getDefinition($field_type)['list_class'];
      $field_denormalization_context = array_merge($context, [
        'field_type' => $field_type,
        'field_name' => $internal_name,
        'field_definition' => $this->fieldManager
          ->getFieldDefinitions($resource_type->getEntityTypeId(), $resource_type->getBundle())[$internal_name],
      ]);
      $data_internal[$internal_name] = $this->serializer
        ->denormalize($field_value, $field_class, $format, $field_denormalization_context);
    }
    return $data_internal;
  }
  
  /**
   * {@inheritdoc}
   */
  public function hasCacheableSupportsMethod() : bool {
    return TRUE;
  }
}
Members
| Title Sort descending | Modifiers | Object type | Summary | Overriden Title | Overrides | 
|---|---|---|---|---|---|
| CacheableNormalizerInterface::SERIALIZATION_CONTEXT_CACHEABILITY | constant | Name of key for bubbling cacheability metadata via serialization context. | |||
| ContentEntityDenormalizer::$supportedInterfaceOrClass | protected | property | The interface or class that this Normalizer supports. | Overrides NormalizerBase::$supportedInterfaceOrClass | |
| ContentEntityDenormalizer::hasCacheableSupportsMethod | public | function | Overrides NormalizerBase::hasCacheableSupportsMethod | ||
| ContentEntityDenormalizer::prepareInput | protected | function | Prepares the input data to create the entity. | Overrides EntityDenormalizerBase::prepareInput | |
| EntityDenormalizerBase::$entityTypeManager | protected | property | The entity type manager. | ||
| EntityDenormalizerBase::$fieldManager | protected | property | The entity field manager. | ||
| EntityDenormalizerBase::$pluginManager | protected | property | The field plugin manager. | ||
| EntityDenormalizerBase::$resourceTypeRepository | protected | property | The JSON:API resource type repository. | ||
| EntityDenormalizerBase::denormalize | public | function | |||
| EntityDenormalizerBase::normalize | public | function | |||
| EntityDenormalizerBase::supportsNormalization | public | function | Overrides NormalizerBase::supportsNormalization | ||
| EntityDenormalizerBase::__construct | public | function | Constructs an EntityDenormalizerBase object. | ||
| NormalizerBase::$format | protected | property | List of formats which supports (de-)normalization. | Overrides NormalizerBase::$format | |
| NormalizerBase::addCacheableDependency | protected | function | Adds cacheability if applicable. | ||
| NormalizerBase::checkFormat | protected | function | Checks if the provided format is supported by this normalizer. | Overrides NormalizerBase::checkFormat | |
| NormalizerBase::rasterizeValueRecursive | protected static | function | Rasterizes a value recursively. | ||
| NormalizerBase::supportsDenormalization | public | function | Implements \Symfony\Component\Serializer\Normalizer\DenormalizerInterface::supportsDenormalization() | 1 | 
Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.