From 9674e3a44850ef835eb73e2a73762d19e80a0a5a Mon Sep 17 00:00:00 2001 From: catch Date: Tue, 3 Aug 2021 15:26:06 +0100 Subject: [PATCH] Issue #3063343 by phenaproxima, Wim Leers, larowlan, seanB, effulgentsia: Make MediaLibraryState implement CacheableDependencyInterface to remove the need for hardcoding a cache context --- .../src/MediaLibraryFieldWidgetOpener.php | 20 +++++++-------- .../media_library/src/MediaLibraryState.php | 25 ++++++++++++++++++- .../src/Kernel/MediaLibraryStateTest.php | 7 ++++++ 3 files changed, 41 insertions(+), 11 deletions(-) diff --git a/core/modules/media_library/src/MediaLibraryFieldWidgetOpener.php b/core/modules/media_library/src/MediaLibraryFieldWidgetOpener.php index 348f22f1046..ccbe1a9d262 100644 --- a/core/modules/media_library/src/MediaLibraryFieldWidgetOpener.php +++ b/core/modules/media_library/src/MediaLibraryFieldWidgetOpener.php @@ -41,17 +41,10 @@ class MediaLibraryFieldWidgetOpener implements MediaLibraryOpenerInterface { public function checkAccess(MediaLibraryState $state, AccountInterface $account) { $parameters = $state->getOpenerParameters() + ['entity_id' => NULL]; - $process_result = function ($result) { - if ($result instanceof RefinableCacheableDependencyInterface) { - $result->addCacheContexts(['url.query_args']); - } - return $result; - }; - // Forbid access if any of the required parameters are missing. foreach (['entity_type_id', 'bundle', 'field_name'] as $key) { if (empty($parameters[$key])) { - return $process_result(AccessResult::forbidden("$key parameter is missing.")); + return AccessResult::forbidden("$key parameter is missing.")->addCacheableDependency($state); } } @@ -83,7 +76,10 @@ class MediaLibraryFieldWidgetOpener implements MediaLibraryOpenerInterface { // If entity-level access is denied, there's no point in continuing. if (!$entity_access->isAllowed()) { - return $process_result($entity_access); + if ($entity_access instanceof RefinableCacheableDependencyInterface) { + $entity_access->addCacheableDependency($state); + } + return $entity_access; } // If the entity has not been loaded, create it in memory now. @@ -107,7 +103,11 @@ class MediaLibraryFieldWidgetOpener implements MediaLibraryOpenerInterface { } $field_access = $access_handler->fieldAccess('edit', $field_definition, $account, $items, TRUE); - return $process_result($entity_access->andIf($field_access)); + $access = $entity_access->andIf($field_access); + if ($access instanceof RefinableCacheableDependencyInterface) { + $access->addCacheableDependency($state); + } + return $access; } /** diff --git a/core/modules/media_library/src/MediaLibraryState.php b/core/modules/media_library/src/MediaLibraryState.php index e1fd6e2e8b9..e1f0b4632dc 100644 --- a/core/modules/media_library/src/MediaLibraryState.php +++ b/core/modules/media_library/src/MediaLibraryState.php @@ -3,6 +3,8 @@ namespace Drupal\media_library; use Drupal\Component\Utility\Crypt; +use Drupal\Core\Cache\Cache; +use Drupal\Core\Cache\CacheableDependencyInterface; use Drupal\Core\Site\Settings; use Symfony\Component\HttpFoundation\ParameterBag; use Symfony\Component\HttpFoundation\Request; @@ -37,7 +39,7 @@ use Symfony\Component\HttpKernel\Exception\BadRequestHttpException; * * @see \Drupal\media_library\MediaLibraryOpenerInterface */ -class MediaLibraryState extends ParameterBag { +class MediaLibraryState extends ParameterBag implements CacheableDependencyInterface { /** * {@inheritdoc} @@ -269,4 +271,25 @@ class MediaLibraryState extends ParameterBag { return $this->get('media_library_opener_parameters', []); } + /** + * {@inheritdoc} + */ + public function getCacheContexts() { + return ['url.query_args']; + } + + /** + * {@inheritdoc} + */ + public function getCacheMaxAge() { + return Cache::PERMANENT; + } + + /** + * {@inheritdoc} + */ + public function getCacheTags() { + return []; + } + } diff --git a/core/modules/media_library/tests/src/Kernel/MediaLibraryStateTest.php b/core/modules/media_library/tests/src/Kernel/MediaLibraryStateTest.php index dc159ea43a8..ffc5dd27ee4 100644 --- a/core/modules/media_library/tests/src/Kernel/MediaLibraryStateTest.php +++ b/core/modules/media_library/tests/src/Kernel/MediaLibraryStateTest.php @@ -2,6 +2,8 @@ namespace Drupal\Tests\media_library\Kernel; +use Drupal\Core\Cache\Cache; +use Drupal\Core\Cache\CacheableDependencyInterface; use Drupal\KernelTests\KernelTestBase; use Drupal\media_library\MediaLibraryState; use Drupal\Tests\media\Traits\MediaTypeCreationTrait; @@ -104,6 +106,11 @@ class MediaLibraryStateTest extends KernelTestBase { } $state = MediaLibraryState::create($opener_id, $allowed_media_type_ids, $selected_type_id, $remaining_slots); $this->assertInstanceOf(MediaLibraryState::class, $state); + + // Ensure that the state object carries cache metadata. + $this->assertInstanceOf(CacheableDependencyInterface::class, $state); + $this->assertSame(['url.query_args'], $state->getCacheContexts()); + $this->assertSame(Cache::PERMANENT, $state->getCacheMaxAge()); } /**