src/Normalizer/EntityNormalizer.php | 21 ++++++++++++--------- .../Unit/Normalizer/ConfigEntityNormalizerTest.php | 4 +++- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/src/Normalizer/EntityNormalizer.php b/src/Normalizer/EntityNormalizer.php index 8727a48..c3d8877 100644 --- a/src/Normalizer/EntityNormalizer.php +++ b/src/Normalizer/EntityNormalizer.php @@ -4,7 +4,6 @@ namespace Drupal\jsonapi\Normalizer; use Drupal\Core\Entity\ContentEntityInterface; use Drupal\Core\Entity\EntityTypeManagerInterface; -use Drupal\Core\Field\EntityReferenceFieldItemListInterface; use Drupal\Core\TypedData\TypedDataInternalPropertiesHelper; use Drupal\jsonapi\Normalizer\Value\EntityNormalizerValue; use Drupal\jsonapi\Normalizer\Value\FieldNormalizerValueInterface; @@ -97,21 +96,25 @@ class EntityNormalizer extends NormalizerBase implements DenormalizerInterface { $normalizer_values = []; $relationship_field_names = array_keys($resource_type->getRelatableResourceTypes()); foreach ($this->getFields($entity, $bundle, $resource_type) as $field_name => $field) { + $normalized_field = $this->serializeField($field, $context, $format); + assert($normalized_field instanceof FieldNormalizerValueInterface); + $in_sparse_fieldset = in_array($field_name, $field_names); $is_relationship_field = in_array($field_name, $relationship_field_names); // Omit fields not listed in sparse fieldsets, except if they're fields // modeling relationships; despite a relationship field being omitted, // using `?include` to include related resources is still allowed. - if (!$in_sparse_fieldset && !$is_relationship_field) { + if (!$in_sparse_fieldset) { + if ($is_relationship_field) { + $is_null_field = $field instanceof NullFieldNormalizerValue; + $has_includes = !empty($normalized_field->getIncludes()); + if (!$is_null_field && $has_includes) { + $normalizer_values[$field_name] = new IncludeOnlyRelationshipNormalizerValue($normalized_field); + } + } continue; } - $normalized_field = $this->serializeField($field, $context, $format); - assert($normalized_field instanceof FieldNormalizerValueInterface); - $is_null_field = $field instanceof NullFieldNormalizerValue; - $has_includes = !empty($normalized_field->getIncludes()); - $normalizer_values[$field_name] = !$in_sparse_fieldset && !$is_null_field && $has_includes - ? new IncludeOnlyRelationshipNormalizerValue($normalized_field) - : $normalized_field; + $normalizer_values[$field_name] = $normalized_field; } $link_context = ['link_manager' => $this->linkManager]; diff --git a/tests/src/Unit/Normalizer/ConfigEntityNormalizerTest.php b/tests/src/Unit/Normalizer/ConfigEntityNormalizerTest.php index 3d1aab1..27fff3e 100644 --- a/tests/src/Unit/Normalizer/ConfigEntityNormalizerTest.php +++ b/tests/src/Unit/Normalizer/ConfigEntityNormalizerTest.php @@ -32,9 +32,11 @@ class ConfigEntityNormalizerTest extends UnitTestCase { public function setUp() { $link_manager = $this->prophesize(LinkManager::class); + $resource_type = new ResourceType('dolor', 'sid', NULL); + $resource_type->setRelatableResourceTypes([]); $resource_type_repository = $this->prophesize(ResourceTypeRepository::class); $resource_type_repository->get(Argument::type('string'), Argument::type('string')) - ->willReturn(new ResourceType('dolor', 'sid', NULL)); + ->willReturn($resource_type); $this->normalizer = new ConfigEntityNormalizer( $link_manager->reveal(),