X-Git-Url: http://www.aleph1.co.uk/gitweb/?p=yaffs-website;a=blobdiff_plain;f=web%2Fcore%2Fmodules%2Fserialization%2Fsrc%2FNormalizer%2FEntityReferenceFieldItemNormalizer.php;h=ea2e020bf00f558513e9cff01201db4b55f1cc31;hp=4706bf403de3f6663efaad23a58fbd4c3d87939c;hb=9917807b03b64faf00f6a1f29dcb6eafc454efa5;hpb=aea91e65e895364e460983b890e295aa5d5540a5 diff --git a/web/core/modules/serialization/src/Normalizer/EntityReferenceFieldItemNormalizer.php b/web/core/modules/serialization/src/Normalizer/EntityReferenceFieldItemNormalizer.php index 4706bf403..ea2e020bf 100644 --- a/web/core/modules/serialization/src/Normalizer/EntityReferenceFieldItemNormalizer.php +++ b/web/core/modules/serialization/src/Normalizer/EntityReferenceFieldItemNormalizer.php @@ -2,12 +2,15 @@ namespace Drupal\serialization\Normalizer; +use Drupal\Core\Entity\EntityRepositoryInterface; use Drupal\Core\Field\Plugin\Field\FieldType\EntityReferenceItem; +use Symfony\Component\Serializer\Exception\InvalidArgumentException; +use Symfony\Component\Serializer\Exception\UnexpectedValueException; /** * Adds the file URI to embedded file entities. */ -class EntityReferenceFieldItemNormalizer extends ComplexDataNormalizer { +class EntityReferenceFieldItemNormalizer extends FieldItemNormalizer { /** * The interface or class that this Normalizer supports. @@ -16,6 +19,23 @@ class EntityReferenceFieldItemNormalizer extends ComplexDataNormalizer { */ protected $supportedInterfaceOrClass = EntityReferenceItem::class; + /** + * The entity repository. + * + * @var \Drupal\Core\Entity\EntityRepositoryInterface + */ + protected $entityRepository; + + /** + * Constructs a EntityReferenceFieldItemNormalizer object. + * + * @param \Drupal\Core\Entity\EntityRepositoryInterface $entity_repository + * The entity repository. + */ + public function __construct(EntityRepositoryInterface $entity_repository) { + $this->entityRepository = $entity_repository; + } + /** * {@inheritdoc} */ @@ -35,8 +55,32 @@ class EntityReferenceFieldItemNormalizer extends ComplexDataNormalizer { $values['url'] = $url; } } - return $values; } + /** + * {@inheritdoc} + */ + protected function constructValue($data, $context) { + if (isset($data['target_uuid'])) { + /** @var \Drupal\Core\Field\Plugin\Field\FieldType\EntityReferenceItem $field_item */ + $field_item = $context['target_instance']; + if (empty($data['target_uuid'])) { + throw new InvalidArgumentException(sprintf('If provided "target_uuid" cannot be empty for field "%s".', $data['target_type'], $data['target_uuid'], $field_item->getName())); + } + $target_type = $field_item->getFieldDefinition()->getSetting('target_type'); + if (!empty($data['target_type']) && $target_type !== $data['target_type']) { + throw new UnexpectedValueException(sprintf('The field "%s" property "target_type" must be set to "%s" or omitted.', $field_item->getFieldDefinition()->getName(), $target_type)); + } + if ($entity = $this->entityRepository->loadEntityByUuid($target_type, $data['target_uuid'])) { + return ['target_id' => $entity->id()]; + } + else { + // Unable to load entity by uuid. + throw new InvalidArgumentException(sprintf('No "%s" entity found with UUID "%s" for field "%s".', $data['target_type'], $data['target_uuid'], $field_item->getName())); + } + } + return parent::constructValue($data, $context); + } + }