jsonapi.services.yml | 4 ++-- src/Normalizer/EntityNormalizer.php | 24 +++++++++++++++++++----- 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/jsonapi.services.yml b/jsonapi.services.yml index fad601a..8761daa 100644 --- a/jsonapi.services.yml +++ b/jsonapi.services.yml @@ -66,7 +66,7 @@ services: - { name: jsonapi_normalizer_do_not_use_removal_imminent } serializer.normalizer.entity.jsonapi: class: Drupal\jsonapi\Normalizer\ContentEntityNormalizer - arguments: ['@jsonapi.link_manager', '@jsonapi.resource_type.repository', '@entity_type.manager', '@entity_field.manager', '@plugin.manager.field.field_type'] + arguments: ['@jsonapi.link_manager', '@jsonapi.resource_type.repository', '@entity_type.manager', '@entity_field.manager', '@plugin.manager.field.field_type', '@cache.jsonapi_normalizations'] tags: - { name: jsonapi_normalizer_do_not_use_removal_imminent } serializer.normalizer.entity.label_only.jsonapi: @@ -76,7 +76,7 @@ services: - { 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', '@entity_field.manager', '@plugin.manager.field.field_type'] + parent: serializer.normalizer.entity.jsonapi tags: - { name: jsonapi_normalizer_do_not_use_removal_imminent } serializer.normalizer.jsonapi_document_toplevel.jsonapi: diff --git a/src/Normalizer/EntityNormalizer.php b/src/Normalizer/EntityNormalizer.php index 9c5f50b..1ddc5ab 100644 --- a/src/Normalizer/EntityNormalizer.php +++ b/src/Normalizer/EntityNormalizer.php @@ -4,6 +4,7 @@ namespace Drupal\jsonapi\Normalizer; use Drupal\Core\Cache\Cache; use Drupal\Core\Cache\CacheableMetadata; +use Drupal\Core\Cache\CacheBackendInterface; use Drupal\Core\Entity\ContentEntityInterface; use Drupal\Core\Entity\EntityFieldManagerInterface; use Drupal\Core\Entity\EntityInterface; @@ -80,6 +81,13 @@ class EntityNormalizer extends NormalizerBase implements DenormalizerInterface { protected $pluginManager; /** + * Cache backend. + * + * @var \Drupal\Core\Cache\CacheBackendInterface + */ + protected $cache; + + /** * Constructs an EntityNormalizer object. * * @param \Drupal\jsonapi\LinkManager\LinkManager $link_manager @@ -92,13 +100,16 @@ class EntityNormalizer extends NormalizerBase implements DenormalizerInterface { * The entity field manager. * @param \Drupal\Core\Field\FieldTypePluginManagerInterface $plugin_manager * The plugin manager for fields. + * @param \Drupal\Core\Cache\CacheBackendInterface $cache + * The cache backend. */ - public function __construct(LinkManager $link_manager, ResourceTypeRepositoryInterface $resource_type_repository, EntityTypeManagerInterface $entity_type_manager, EntityFieldManagerInterface $field_manager, FieldTypePluginManagerInterface $plugin_manager) { + public function __construct(LinkManager $link_manager, ResourceTypeRepositoryInterface $resource_type_repository, EntityTypeManagerInterface $entity_type_manager, EntityFieldManagerInterface $field_manager, FieldTypePluginManagerInterface $plugin_manager, CacheBackendInterface $cache) { $this->linkManager = $link_manager; $this->resourceTypeRepository = $resource_type_repository; $this->entityTypeManager = $entity_type_manager; $this->fieldManager = $field_manager; $this->pluginManager = $plugin_manager; + $this->cache = $cache; } /** @@ -112,9 +123,8 @@ class EntityNormalizer extends NormalizerBase implements DenormalizerInterface { ); $resource_type_name = $resource_type->getTypeName(); - $cache = \Drupal::cache('jsonapi_normalizations'); $cid = $resource_type_name . '/' . $entity->uuid(); - $cached_normalization_parts = $cache->get($cid); + $cached_normalization_parts = $this->cache->get($cid); if ($cached_normalization_parts !== FALSE) { $normalization_parts = $cached_normalization_parts->data; } @@ -122,7 +132,7 @@ class EntityNormalizer extends NormalizerBase implements DenormalizerInterface { $normalization_parts = $this->doNormalize($resource_type, $entity, $format, $context); $normalization_parts_cacheability = static::mergeCacheableDependencies($normalization_parts['fields']); $cache_tags = Cache::mergeTags($entity->getCacheTags(), $normalization_parts_cacheability->getCacheTags()); - $cache->set($cid, $normalization_parts, Cache::PERMANENT, $cache_tags); + $this->cache->set($cid, $normalization_parts, Cache::PERMANENT, $cache_tags); } // If a sparse fieldset is active during this normalization, keep only the @@ -140,7 +150,11 @@ class EntityNormalizer extends NormalizerBase implements DenormalizerInterface { return (new CacheableNormalization($entity, array_filter($entity_normalizaton)))->withCacheableDependency($attributes)->withCacheableDependency($relationships); } - // @todo remove $format & $context + /** + * Does the actual normalization. + * + * @todo remove $format & $context + */ private function doNormalize(ResourceType $resource_type, EntityInterface $entity, $format = NULL, array $context = []) { // Get the bundle ID of the requested resource. This is used to determine if // this is a bundle level resource or an entity level resource.