hn-8.x-1.x-dev/src/Normalizer/TypedDataNormalizer.php
src/Normalizer/TypedDataNormalizer.php
<?php namespace Drupal\hn\Normalizer; use Drupal\Core\Field\FieldItemListInterface; use Drupal\serialization\Normalizer\TypedDataNormalizer as SerializationTypedDataNormalizer; /** * Normalizes TypedData. */ class TypedDataNormalizer extends SerializationTypedDataNormalizer { protected $format = ['hn']; /** * The normalizer used to normalize the typed data. * * @var \Symfony\Component\Serializer\Normalizer\NormalizerInterface */ protected $serializer; protected $serializingParent = FALSE; /** * {@inheritdoc} */ public function supportsNormalization($data, $format = NULL) { if ($this->serializingParent) { $this->serializingParent = FALSE; // Let parent handle it. return FALSE; } return parent::supportsNormalization($data, $format); } /** * {@inheritdoc} */ public function normalize($object, $format = NULL, array $context = []) { /* @var $object \Drupal\Core\TypedData\TypedDataInterface */ if (!$this->serializer) { $this->serializer = \Drupal::service('serializer'); } $this->serializingParent = TRUE; $value = $this->serializer->normalize($object, $format, $context); $this->serializingParent = FALSE; // If this is a field with never more then 1 value, show the first value. if ($object instanceof FieldItemListInterface) { $cardinality = $object->getFieldDefinition()->getFieldStorageDefinition()->getCardinality(); if ($cardinality === 1) { if (isset($value[0])) { $value = $value[0]; } else { $value = NULL; } } } // If the value is an associative array with 'value' as only key, // return the value of 'value'. if (is_array($value) && isset($value['value']) && count($value) === 1) { $value = $value['value']; } return $value; } }