diff --git a/core/modules/serialization/src/Normalizer/EntityReferenceFieldItemNormalizer.php b/core/modules/serialization/src/Normalizer/EntityReferenceFieldItemNormalizer.php index 5298d6a..4515f31 100644 --- a/core/modules/serialization/src/Normalizer/EntityReferenceFieldItemNormalizer.php +++ b/core/modules/serialization/src/Normalizer/EntityReferenceFieldItemNormalizer.php @@ -2,6 +2,7 @@ namespace Drupal\serialization\Normalizer; +use Doctrine\Common\Proxy\Exception\InvalidArgumentException; use Drupal\Core\Entity\EntityRepositoryInterface; use Drupal\Core\Field\Plugin\Field\FieldType\EntityReferenceItem; use Symfony\Component\Serializer\Exception\UnexpectedValueException; @@ -64,12 +65,19 @@ protected function constructValue($data, $context) { if (!empty($data['target_uuid'])) { /** @var \Drupal\Core\Field\Plugin\Field\FieldType\EntityReferenceItem $field_item */ $field_item = $context['target_instance']; - $target_type = $field_item->getFieldDefinition()->getSetting('target_type'); + if (!empty($data['target_type'])) { + $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)); } - $entity = $this->entityRepository->loadEntityByUuid($target_type, $data['target_uuid']); - return ['target_id' => $entity->id()]; + if ($entity = $this->entityRepository->loadEntityByUuid($data['target_type'], $data['target_uuid'])) { + return ['target_id' => $entity->id()]; + } + else { + // Unable to load entity by uuid. + throw new InvalidArgumentException(sprintf('"%s" is not a valid UUID.', $data['target_uuid'])); + } } return parent::constructValue($data, $context); } diff --git a/core/modules/serialization/tests/src/Unit/Normalizer/EntityReferenceFieldItemNormalizerTest.php b/core/modules/serialization/tests/src/Unit/Normalizer/EntityReferenceFieldItemNormalizerTest.php index 519963f..e12b837 100644 --- a/core/modules/serialization/tests/src/Unit/Normalizer/EntityReferenceFieldItemNormalizerTest.php +++ b/core/modules/serialization/tests/src/Unit/Normalizer/EntityReferenceFieldItemNormalizerTest.php @@ -199,6 +199,26 @@ public function testDenormalizeWithUuidWithIncorrectType() { /** * @covers ::denormalize + * + * @expectedException \Doctrine\Common\Proxy\Exception\InvalidArgumentException + * @expectedExceptionMessage "unique-but-none-non-existent" is not a valid UUID. + */ + public function testDenormalizeWithTypeWithIncorrectUuid() { + $data = [ + 'target_id' => ['value' => 'test'], + 'target_type' => 'test_type', + 'target_uuid' => 'unique-but-none-non-existent', + ]; + $this->entityRepository + ->loadEntityByUuid($data['target_type'], $data['target_uuid']) + ->willReturn(NULL) + ->shouldBeCalled(); + + $this->assertDenormalize($data); + } + + /** + * @covers ::denormalize */ public function testDenormalizeWithId() { $data = [