diff --git a/core/lib/Drupal/Core/Entity/Element/EntityAutocomplete.php b/core/lib/Drupal/Core/Entity/Element/EntityAutocomplete.php index 083de1d639..a620918b76 100644 --- a/core/lib/Drupal/Core/Entity/Element/EntityAutocomplete.php +++ b/core/lib/Drupal/Core/Entity/Element/EntityAutocomplete.php @@ -4,6 +4,7 @@ use Drupal\Component\Utility\Crypt; use Drupal\Component\Utility\Tags; +use Drupal\Core\Cache\CacheableMetadata; use Drupal\Core\Entity\EntityInterface; use Drupal\Core\Entity\EntityReferenceSelection\SelectionInterface; use Drupal\Core\Entity\EntityReferenceSelection\SelectionWithAutocreateInterface; @@ -176,10 +177,15 @@ public static function processEntityAutocomplete(array &$element, FormStateInter $data = serialize($selection_settings) . $element['#target_type'] . $element['#selection_handler']; $selection_settings_key = Crypt::hmacBase64($data, Settings::getHashSalt()); - $key_value_storage = \Drupal::keyValue('entity_autocomplete'); - if (!$key_value_storage->has($selection_settings_key)) { - $key_value_storage->set($selection_settings_key, $selection_settings); - } + // Even if the key already exists, we still need to refresh the expiry. + $expire = 86400; + $key_value_storage = \Drupal::keyValueExpirable('entity_autocomplete'); + $key_value_storage->setWithExpire($selection_settings_key, $selection_settings, $expire); + // Since the key value entry expires, this element cannot live longer than + // the expiry or it won't work past that time. + $cache = CacheableMetadata::createFromRenderArray($element); + $cache->setCacheMaxAge($expire); + $cache->applyTo($element); $element['#autocomplete_route_name'] = 'system.entity_autocomplete'; $element['#autocomplete_route_parameters'] = [ diff --git a/core/modules/system/src/Controller/EntityAutocompleteController.php b/core/modules/system/src/Controller/EntityAutocompleteController.php index 863c7535d6..e1420764e6 100644 --- a/core/modules/system/src/Controller/EntityAutocompleteController.php +++ b/core/modules/system/src/Controller/EntityAutocompleteController.php @@ -28,7 +28,7 @@ class EntityAutocompleteController extends ControllerBase { /** * The key value store. * - * @var \Drupal\Core\KeyValueStore\KeyValueStoreInterface + * @var \Drupal\Core\KeyValueStore\KeyValueStoreExpirableInterface */ protected $keyValue; @@ -51,7 +51,7 @@ public function __construct(EntityAutocompleteMatcherInterface $matcher, KeyValu public static function create(ContainerInterface $container) { return new static( $container->get('entity.autocomplete_matcher'), - $container->get('keyvalue')->get('entity_autocomplete') + $container->get('keyvalue.expirable')->get('entity_autocomplete') ); }