jsonapi-8.x-2.x-dev/src/Normalizer/EntityDenormalizerBase.php
src/Normalizer/EntityDenormalizerBase.php
<?php namespace Drupal\jsonapi\Normalizer; use Drupal\Core\Entity\EntityFieldManagerInterface; use Drupal\Core\Entity\EntityTypeManagerInterface; use Drupal\Core\Field\FieldTypePluginManagerInterface; use Drupal\jsonapi\ResourceType\ResourceType; use Symfony\Component\HttpKernel\Exception\PreconditionFailedHttpException; use Symfony\Component\Serializer\Normalizer\DenormalizerInterface; /** * Converts the Drupal entity object to a JSON:API array structure. * * @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. * * @see https://www.drupal.org/project/jsonapi/issues/3032787 * @see jsonapi.api.php */ abstract class EntityDenormalizerBase extends NormalizerBase implements DenormalizerInterface { /** * The JSON:API resource type repository. * * @var \Drupal\jsonapi\ResourceType\ResourceTypeRepositoryInterface */ protected $resourceTypeRepository; /** * The entity type manager. * * @var \Drupal\Core\Entity\EntityTypeManagerInterface */ protected $entityTypeManager; /** * The entity field manager. * * @var \Drupal\Core\Entity\EntityFieldManagerInterface */ protected $fieldManager; /** * The field plugin manager. * * @var \Drupal\Core\Field\FieldTypePluginManagerInterface */ protected $pluginManager; /** * Constructs an EntityDenormalizerBase object. * * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager * The entity type manager. * @param \Drupal\Core\Entity\EntityFieldManagerInterface $field_manager * The entity field manager. * @param \Drupal\Core\Field\FieldTypePluginManagerInterface $plugin_manager * The plugin manager for fields. */ public function __construct(EntityTypeManagerInterface $entity_type_manager, EntityFieldManagerInterface $field_manager, FieldTypePluginManagerInterface $plugin_manager) { $this->entityTypeManager = $entity_type_manager; $this->fieldManager = $field_manager; $this->pluginManager = $plugin_manager; } /** * {@inheritdoc} */ public function supportsNormalization($data, $format = NULL) { return FALSE; } /** * {@inheritdoc} */ public function normalize($object, $format = NULL, array $context = []) { throw new \LogicException('This method should never be called.'); } /** * {@inheritdoc} */ public function denormalize($data, $class, $format = NULL, array $context = []) { if (empty($context['resource_type']) || !$context['resource_type'] instanceof ResourceType) { throw new PreconditionFailedHttpException('Missing context during denormalization.'); } /* @var \Drupal\jsonapi\ResourceType\ResourceType $resource_type */ $resource_type = $context['resource_type']; $entity_type_id = $resource_type->getEntityTypeId(); $bundle = $resource_type->getBundle(); $bundle_key = $this->entityTypeManager->getDefinition($entity_type_id) ->getKey('bundle'); if ($bundle_key && $bundle) { $data[$bundle_key] = $bundle; } return $this->entityTypeManager->getStorage($entity_type_id) ->create($this->prepareInput($data, $resource_type, $format, $context)); } /** * 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. */ abstract protected function prepareInput(array $data, ResourceType $resource_type, $format, array $context); }