.../src/Normalizer/DateTimeIso8601Normalizer.php | 6 ++++- .../src/Normalizer/DateTimeNormalizer.php | 6 ++++- .../Normalizer/DateTimeIso8601NormalizerTest.php | 30 ++++++++++++++++++++++ .../src/Unit/Normalizer/DateTimeNormalizerTest.php | 11 ++++++++ 4 files changed, 51 insertions(+), 2 deletions(-) diff --git a/core/modules/serialization/src/Normalizer/DateTimeIso8601Normalizer.php b/core/modules/serialization/src/Normalizer/DateTimeIso8601Normalizer.php index 8138639..4515e52 100644 --- a/core/modules/serialization/src/Normalizer/DateTimeIso8601Normalizer.php +++ b/core/modules/serialization/src/Normalizer/DateTimeIso8601Normalizer.php @@ -42,7 +42,11 @@ class DateTimeIso8601Normalizer extends DateTimeNormalizer { public function normalize($datetime, $format = NULL, array $context = []) { $field_item = $datetime->getParent(); if ($field_item instanceof DateTimeItem && $field_item->getFieldDefinition()->getFieldStorageDefinition()->getSetting('datetime_type') === DateTimeItem::DATETIME_TYPE_DATE) { - return $datetime->getDateTime()->format($this->allowedFormats['date-only']); + $drupal_date_time = $datetime->getDateTime(); + if ($drupal_date_time === NULL) { + return $drupal_date_time; + } + return $drupal_date_time->format($this->allowedFormats['date-only']); } return parent::normalize($datetime, $format, $context); } diff --git a/core/modules/serialization/src/Normalizer/DateTimeNormalizer.php b/core/modules/serialization/src/Normalizer/DateTimeNormalizer.php index 59ca022..89e4e86 100644 --- a/core/modules/serialization/src/Normalizer/DateTimeNormalizer.php +++ b/core/modules/serialization/src/Normalizer/DateTimeNormalizer.php @@ -46,7 +46,11 @@ class DateTimeNormalizer extends NormalizerBase implements DenormalizerInterface * {@inheritdoc} */ public function normalize($datetime, $format = NULL, array $context = []) { - return $datetime->getDateTime() + $drupal_date_time = $datetime->getDateTime(); + if ($drupal_date_time === NULL) { + return $drupal_date_time; + } + return $drupal_date_time // Set an explicit timezone. Otherwise, timestamps may end up being // normalized using the user's preferred timezone. Which would result in // many variations and complex caching. diff --git a/core/modules/serialization/tests/src/Unit/Normalizer/DateTimeIso8601NormalizerTest.php b/core/modules/serialization/tests/src/Unit/Normalizer/DateTimeIso8601NormalizerTest.php index c630deb..b3cf2ae 100644 --- a/core/modules/serialization/tests/src/Unit/Normalizer/DateTimeIso8601NormalizerTest.php +++ b/core/modules/serialization/tests/src/Unit/Normalizer/DateTimeIso8601NormalizerTest.php @@ -123,6 +123,36 @@ public function testNormalize($parent_field_item_class, $datetime_type, $expecte } /** + * @covers ::normalize + * @dataProvider providerTestNormalize + */ + public function testNormalizeWhenNull($parent_field_item_class, $datetime_type, $expected_format) { + $field_item = $this->prophesize($parent_field_item_class); + if ($parent_field_item_class === DateTimeItem::class) { + $field_storage_definition = $this->prophesize(FieldStorageDefinitionInterface::class); + $field_storage_definition->getSetting('datetime_type') + ->willReturn($datetime_type); + $field_definition = $this->prophesize(FieldDefinitionInterface::class); + $field_definition->getFieldStorageDefinition() + ->willReturn($field_storage_definition); + $field_item->getFieldDefinition() + ->willReturn($field_definition); + } + else { + $field_item->getFieldDefinition(Argument::any()) + ->shouldNotBeCalled(); + } + $this->data->getParent() + ->willReturn($field_item); + + $this->data->getDateTime() + ->willReturn(NULL); + + $normalized = $this->normalizer->normalize($this->data->reveal()); + $this->assertNull($normalized); + } + + /** * Data provider for testNormalize. * * @return array diff --git a/core/modules/serialization/tests/src/Unit/Normalizer/DateTimeNormalizerTest.php b/core/modules/serialization/tests/src/Unit/Normalizer/DateTimeNormalizerTest.php index f37f75d..570784b 100644 --- a/core/modules/serialization/tests/src/Unit/Normalizer/DateTimeNormalizerTest.php +++ b/core/modules/serialization/tests/src/Unit/Normalizer/DateTimeNormalizerTest.php @@ -95,6 +95,17 @@ public function testNormalize() { } /** + * @covers ::normalize + */ + public function testNormalizeWhenNull() { + $this->data->getDateTime() + ->willReturn(NULL); + + $normalized = $this->normalizer->normalize($this->data->reveal()); + $this->assertNull($normalized); + } + + /** * Tests the denormalize function with good data. * * @covers ::denormalize