jsonapi.services.yml | 3 +-- src/Normalizer/LabelOnlyEntityNormalizer.php | 21 +++++++++++++++++++-- tests/src/Functional/ResourceResponseTestTrait.php | 3 +++ 3 files changed, 23 insertions(+), 4 deletions(-) diff --git a/jsonapi.services.yml b/jsonapi.services.yml index 485317d..6604bb1 100644 --- a/jsonapi.services.yml +++ b/jsonapi.services.yml @@ -69,10 +69,9 @@ services: - { name: jsonapi_normalizer_do_not_use_removal_imminent } serializer.normalizer.entity.label_only.jsonapi: class: Drupal\jsonapi\Normalizer\LabelOnlyEntityNormalizer - arguments: ['@jsonapi.link_manager'] + arguments: ['@jsonapi.link_manager', '@jsonapi.resource_type.repository'] tags: - { name: jsonapi_normalizer_do_not_use_removal_imminent } - serializer.normalizer.config_entity.jsonapi: class: Drupal\jsonapi\Normalizer\ConfigEntityNormalizer arguments: ['@jsonapi.link_manager', '@jsonapi.resource_type.repository', '@entity_type.manager'] diff --git a/src/Normalizer/LabelOnlyEntityNormalizer.php b/src/Normalizer/LabelOnlyEntityNormalizer.php index 5dc4f18..a1ef16c 100644 --- a/src/Normalizer/LabelOnlyEntityNormalizer.php +++ b/src/Normalizer/LabelOnlyEntityNormalizer.php @@ -6,6 +6,7 @@ use Drupal\jsonapi\LabelOnlyEntity; use Drupal\jsonapi\Normalizer\Value\EntityNormalizerValue; use Drupal\jsonapi\LinkManager\LinkManager; use Drupal\jsonapi\ResourceType\ResourceType; +use Drupal\jsonapi\ResourceType\ResourceTypeRepositoryInterface; /** * Pretends that the entity only has a single field: the label field. @@ -34,13 +35,23 @@ class LabelOnlyEntityNormalizer extends NormalizerBase { protected $linkManager; /** + * The JSON API resource type repository. + * + * @var \Drupal\jsonapi\ResourceType\ResourceTypeRepositoryInterface + */ + protected $resourceTypeRepository; + + /** * Constructs an LabelOnlyEntityNormalizer object. * * @param \Drupal\jsonapi\LinkManager\LinkManager $link_manager * The link manager. + * @param \Drupal\jsonapi\ResourceType\ResourceTypeRepositoryInterface $resource_type_repository + * The JSON API resource type repository. */ - public function __construct(LinkManager $link_manager) { + public function __construct(LinkManager $link_manager, ResourceTypeRepositoryInterface $resource_type_repository) { $this->linkManager = $link_manager; + $this->resourceTypeRepository = $resource_type_repository; } /** @@ -48,9 +59,15 @@ class LabelOnlyEntityNormalizer extends NormalizerBase { */ public function normalize($label_only_entity, $format = NULL, array $context = []) { assert($label_only_entity instanceof LabelOnlyEntity); + $entity = $label_only_entity->getEntity(); + + // If the fields to use were specified, only output those field values. + $context['resource_type'] = $this->resourceTypeRepository->get( + $entity->getEntityTypeId(), + $entity->bundle() + ); // Determine the (internal) label field name. - $entity = $label_only_entity->getEntity(); $label_field_name = $entity->getEntityType()->getKey('label'); // @todo Fix Entity/Field API and User module in Drupal core so that despite // there being a label callback, we can also still figure out that "name" is diff --git a/tests/src/Functional/ResourceResponseTestTrait.php b/tests/src/Functional/ResourceResponseTestTrait.php index ca66752..f9e74b7 100644 --- a/tests/src/Functional/ResourceResponseTestTrait.php +++ b/tests/src/Functional/ResourceResponseTestTrait.php @@ -156,6 +156,9 @@ trait ResourceResponseTestTrait { if ($target_entity = $entity->{$field_name}->entity) { $target_access = static::entityAccess($target_entity, 'view', $this->account); if (!$target_access->isAllowed()) { + $target_access = static::entityAccess($target_entity, 'view label', $this->account)->addCacheableDependency($target_access); + } + if (!$target_access->isAllowed()) { $resource_identifier = static::toResourceIdentifier($target_entity); if (!static::collectionHasResourceIdentifier($resource_identifier, $data['already_checked'])) { $data['already_checked'][] = $resource_identifier;