Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
Total | |
0.00% |
0 / 1 |
|
0.00% |
0 / 2 |
CRAP | |
85.00% |
17 / 20 |
EntityNormalizer | |
0.00% |
0 / 1 |
|
0.00% |
0 / 2 |
12.49 | |
85.00% |
17 / 20 |
__construct | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 2 |
|||
denormalize | |
0.00% |
0 / 1 |
11.02 | |
94.44% |
17 / 18 |
<?php | |
/** | |
* @file | |
* Contains \Drupal\serialization\Normalizer\EntityNormalizer. | |
*/ | |
namespace Drupal\serialization\Normalizer; | |
use Drupal\Core\Entity\EntityManagerInterface; | |
use Symfony\Component\Serializer\Exception\UnexpectedValueException; | |
use Symfony\Component\Serializer\Normalizer\DenormalizerInterface; | |
/** | |
* Normalizes/denormalizes Drupal entity objects into an array structure. | |
*/ | |
class EntityNormalizer extends ComplexDataNormalizer implements DenormalizerInterface { | |
/** | |
* The interface or class that this Normalizer supports. | |
* | |
* @var array | |
*/ | |
protected $supportedInterfaceOrClass = array('Drupal\Core\Entity\EntityInterface'); | |
/** | |
* The entity manager. | |
* | |
* @var \Drupal\Core\Entity\EntityManagerInterface | |
*/ | |
protected $entityManager; | |
/** | |
* Constructs an EntityNormalizer object. | |
* | |
* @param \Drupal\Core\Entity\EntityManagerInterface $entity_manager | |
* The entity manager. | |
*/ | |
public function __construct(EntityManagerInterface $entity_manager) { | |
$this->entityManager = $entity_manager; | |
} | |
/** | |
* {@inheritdoc} | |
*/ | |
public function denormalize($data, $class, $format = NULL, array $context = []) { | |
// Get the entity type ID while letting context override the $class param. | |
$entity_type_id = !empty($context['entity_type']) ? $context['entity_type'] : $this->entityManager->getEntityTypeFromClass($class); | |
/** @var \Drupal\Core\Entity\EntityTypeInterface $entity_type_definition */ | |
// Get the entity type definition. | |
$entity_type_definition = $this->entityManager->getDefinition($entity_type_id, FALSE); | |
// Don't try to create an entity without an entity type id. | |
if (!$entity_type_definition) { | |
throw new UnexpectedValueException(sprintf('The specified entity type "%s" does not exist. A valid etnity type is required for denormalization', $entity_type_id)); | |
} | |
// The bundle property will be required to denormalize a bundleable entity. | |
if ($entity_type_definition->hasKey('bundle')) { | |
$bundle_key = $entity_type_definition->getKey('bundle'); | |
// Get the base field definitions for this entity type. | |
$base_field_definitions = $this->entityManager->getBaseFieldDefinitions($entity_type_id); | |
// Get the ID key from the base field definition for the bundle key or | |
// default to 'value'. | |
$key_id = isset($base_field_definitions[$bundle_key]) ? $base_field_definitions[$bundle_key]->getFieldStorageDefinition()->getMainPropertyName() : 'value'; | |
// Normalize the bundle if it is not explicitly set. | |
$data[$bundle_key] = isset($data[$bundle_key][0][$key_id]) ? $data[$bundle_key][0][$key_id] : (isset($data[$bundle_key]) ? $data[$bundle_key] : NULL); | |
// Get the bundle entity type from the entity type definition. | |
$bundle_type_id = $entity_type_definition->getBundleEntityType(); | |
$bundle_types = $bundle_type_id ? $this->entityManager->getStorage($bundle_type_id)->getQuery()->execute() : []; | |
// Make sure a bundle has been provided. | |
if (!is_string($data[$bundle_key])) { | |
throw new UnexpectedValueException('A string must be provided as a bundle value.'); | |
} | |
// Make sure the submitted bundle is a valid bundle for the entity type. | |
if ($bundle_types && !in_array($data[$bundle_key], $bundle_types)) { | |
throw new UnexpectedValueException(sprintf('"%s" is not a valid bundle type for denormalization.', $data[$bundle_key])); | |
} | |
} | |
// Create the entity from data. | |
$entity = $this->entityManager->getStorage($entity_type_id)->create($data); | |
// Pass the names of the fields whose values can be merged. | |
// @todo https://www.drupal.org/node/2456257 remove this. | |
$entity->_restSubmittedFields = array_keys($data); | |
return $entity; | |
} | |
} |