diff --git a/core/core.services.yml b/core/core.services.yml index 0350e7e..7350002 100644 --- a/core/core.services.yml +++ b/core/core.services.yml @@ -125,10 +125,8 @@ services: factory_class: Drupal\Component\Utility\Settings factory_method: getSingleton state: - class: Drupal\Core\KeyValueStore\KeyValueStoreInterface - factory_method: get - factory_service: keyvalue - arguments: [state] + class: Drupal\Core\KeyValueStore\State + arguments: ['@keyvalue'] queue: class: Drupal\Core\Queue\QueueFactory arguments: ['@settings'] diff --git a/core/lib/Drupal.php b/core/lib/Drupal.php index 0d100df..6cdadd8 100644 --- a/core/lib/Drupal.php +++ b/core/lib/Drupal.php @@ -288,7 +288,7 @@ public static function keyValue($collection) { * needs to be the same across development, production, etc. environments * (for example, the system maintenance message) should use \Drupal::config() instead. * - * @return \Drupal\Core\KeyValueStore\KeyValueStoreInterface + * @return \Drupal\Core\KeyValueStore\StateInterface */ public static function state() { return static::$container->get('state'); diff --git a/core/lib/Drupal/Core/Asset/CssCollectionOptimizer.php b/core/lib/Drupal/Core/Asset/CssCollectionOptimizer.php index 5d43231..7a10af0 100644 --- a/core/lib/Drupal/Core/Asset/CssCollectionOptimizer.php +++ b/core/lib/Drupal/Core/Asset/CssCollectionOptimizer.php @@ -54,7 +54,7 @@ class CssCollectionOptimizer implements AssetCollectionOptimizerInterface { * @param \Drupal\Core\KeyValueStore\KeyValueStoreInterface * The state key/value store. */ - public function __construct(AssetCollectionGrouperInterface $grouper, AssetOptimizerInterface $optimizer, AssetDumperInterface $dumper, KeyValueStoreInterface $state) { + public function __construct(AssetCollectionGrouperInterface $grouper, AssetOptimizerInterface $optimizer, AssetDumperInterface $dumper, StateInterface $state) { $this->grouper = $grouper; $this->optimizer = $optimizer; $this->dumper = $dumper; diff --git a/core/lib/Drupal/Core/Asset/JsCollectionOptimizer.php b/core/lib/Drupal/Core/Asset/JsCollectionOptimizer.php index bf4cbf6..d70a6b2 100644 --- a/core/lib/Drupal/Core/Asset/JsCollectionOptimizer.php +++ b/core/lib/Drupal/Core/Asset/JsCollectionOptimizer.php @@ -55,7 +55,7 @@ class JsCollectionOptimizer implements AssetCollectionOptimizerInterface { * @param \Drupal\Core\KeyValueStore\KeyValueStoreInterface * The state key/value store. */ - public function __construct(AssetCollectionGrouperInterface $grouper, AssetOptimizerInterface $optimizer, AssetDumperInterface $dumper, KeyValueStoreInterface $state) { + public function __construct(AssetCollectionGrouperInterface $grouper, AssetOptimizerInterface $optimizer, AssetDumperInterface $dumper, StateInterface $state) { $this->grouper = $grouper; $this->optimizer = $optimizer; $this->dumper = $dumper; diff --git a/core/lib/Drupal/Core/Extension/CachedModuleHandler.php b/core/lib/Drupal/Core/Extension/CachedModuleHandler.php index 6e09432..0def7f3 100644 --- a/core/lib/Drupal/Core/Extension/CachedModuleHandler.php +++ b/core/lib/Drupal/Core/Extension/CachedModuleHandler.php @@ -8,7 +8,7 @@ namespace Drupal\Core\Extension; use Drupal\Core\Cache\CacheBackendInterface; -use Drupal\Core\KeyValueStore\KeyValueStoreInterface; +use Drupal\Core\KeyValueStore\StateInterface; /** * Class that manages enabled modules in a Drupal installation. @@ -18,7 +18,7 @@ class CachedModuleHandler extends ModuleHandler implements CachedModuleHandlerIn /** * State key/value store. * - * @var \Drupal\Core\KeyValueStore\KeyValueStoreInterface + * @var \Drupal\Core\KeyValueStore\StateInterface */ protected $state; @@ -39,7 +39,7 @@ class CachedModuleHandler extends ModuleHandler implements CachedModuleHandlerIn /** * Constructs a new CachedModuleHandler object. */ - public function __construct(array $module_list = array(), KeyValueStoreInterface $state, CacheBackendInterface $bootstrap_cache) { + public function __construct(array $module_list = array(), StateInterface $state, CacheBackendInterface $bootstrap_cache) { parent::__construct($module_list); $this->state = $state; $this->bootstrapCache = $bootstrap_cache; diff --git a/core/lib/Drupal/Core/KeyValueStore/State.php b/core/lib/Drupal/Core/KeyValueStore/State.php new file mode 100644 index 0000000..75b950e --- /dev/null +++ b/core/lib/Drupal/Core/KeyValueStore/State.php @@ -0,0 +1,116 @@ +keyValueStore = $keyValueFactory->get('state'); + } + + /** + * {@inheritdoc} + */ + public function getMultiple(array $keys) { + $values = array(); + $load = array(); + foreach ($keys as $key) { + // Check if we have a value in the cache. + if (isset($this->cache[$key])) { + $values[$key] = $this->cache[$key]; + } + // Load the value if we don't have an explicit NULL value. + elseif (!array_key_exists($key, $this->cache)) { + $load[] = $key; + } + } + + if ($load) { + $loaded_values = $this->keyValueStore->getMultiple($load); + foreach ($load as $key) { + if (isset($loaded_values[$key]) || array_key_exists($key, $loaded_values)) { + $values[$key] = $loaded_values[$key]; + $this->cache[$key] = $loaded_values[$key]; + } + else { + $this->cache[$key] = NULL; + } + } + } + + return $values; + } + + /** + * {@inheritdoc} + */ + public function set($key, $value) { + $this->cache[$key] = $value; + $this->keyValueStore->set($key, $value); + } + + /** + * {@inheritdoc} + */ + public function deleteMultiple(array $keys) { + foreach ($keys as $key) { + unset($this->cache[$key]); + } + $this->keyValueStore->deleteMultiple($keys); + } + + + /** + * {@inheritdoc} + */ + public function get($key) { + $values = $this->getMultiple(array($key)); + return isset($values[$key]) ? $values[$key] : NULL; + } + + /** + * {@inheritdoc} + */ + public function setMultiple(array $data) { + foreach ($data as $key => $value) { + $this->cache[$key] = $value; + } + $this->setMultiple($data); + } + + /** + * {@inheritdoc} + */ + public function delete($key) { + $this->deleteMultiple(array($key)); + } + +} diff --git a/core/lib/Drupal/Core/KeyValueStore/StateInterface.php b/core/lib/Drupal/Core/KeyValueStore/StateInterface.php new file mode 100644 index 0000000..36f705c --- /dev/null +++ b/core/lib/Drupal/Core/KeyValueStore/StateInterface.php @@ -0,0 +1,71 @@ +state = $state; } diff --git a/core/lib/Drupal/Core/Path/AliasWhitelist.php b/core/lib/Drupal/Core/Path/AliasWhitelist.php index 0138644..b6b37b7 100644 --- a/core/lib/Drupal/Core/Path/AliasWhitelist.php +++ b/core/lib/Drupal/Core/Path/AliasWhitelist.php @@ -13,6 +13,7 @@ use Drupal\Core\DestructableInterface; use Drupal\Core\KeyValueStore\KeyValueFactory; use Drupal\Core\KeyValueStore\KeyValueStoreInterface; +use Drupal\Core\KeyValueStore\StateInterface; use Drupal\Core\Lock\LockBackendInterface; use Drupal\Core\Utility\CacheArray; @@ -24,7 +25,7 @@ class AliasWhitelist extends CacheCollector { /** * The Key/Value Store to use for state. * - * @var \Drupal\Core\KeyValueStore\KeyValueStoreInterface + * @var \Drupal\Core\KeyValueStore\StateInterface */ protected $state; @@ -44,12 +45,12 @@ class AliasWhitelist extends CacheCollector { * The cache backend. * @param \Drupal\Core\Lock\LockBackendInterface $lock * The lock backend. - * @param \Drupal\Core\KeyValueStore\KeyValueStoreInterface $state + * @param \Drupal\Core\KeyValueStore\StateInterface $state * The state keyvalue store. * @param \Drupal\Core\Database\Connection $connection * The database connection. */ - public function __construct($cid, CacheBackendInterface $cache, LockBackendInterface $lock, KeyValueStoreInterface $state, Connection $connection) { + public function __construct($cid, CacheBackendInterface $cache, LockBackendInterface $lock, StateInterface $state, Connection $connection) { parent::__construct($cid, $cache, $lock); $this->state = $state; $this->connection = $connection; diff --git a/core/lib/Drupal/Core/PrivateKey.php b/core/lib/Drupal/Core/PrivateKey.php index fd8bb55..762a664 100644 --- a/core/lib/Drupal/Core/PrivateKey.php +++ b/core/lib/Drupal/Core/PrivateKey.php @@ -7,7 +7,7 @@ namespace Drupal\Core; -use Drupal\Core\KeyValueStore\KeyValueStoreInterface; +use Drupal\Core\KeyValueStore\StateInterface; use Drupal\Component\Utility\Crypt; /** @@ -18,17 +18,17 @@ class PrivateKey { /** * The state service. * - * @var \Drupal\Core\KeyValueStore\KeyValueStoreInterface + * @var \Drupal\Core\KeyValueStore\StateInterface */ protected $state; /** * Constructs the token generator. * - * @param \Drupal\Core\KeyValueStore\KeyValueStoreInterface $state + * @param \Drupal\Core\KeyValueStore\StateInterface $state * The state service. */ - function __construct(KeyValueStoreInterface $state) { + function __construct(StateInterface $state) { $this->state = $state; } diff --git a/core/modules/field/lib/Drupal/field/FieldInstanceStorageController.php b/core/modules/field/lib/Drupal/field/FieldInstanceStorageController.php index 4a86e01..9cb7d1c 100644 --- a/core/modules/field/lib/Drupal/field/FieldInstanceStorageController.php +++ b/core/modules/field/lib/Drupal/field/FieldInstanceStorageController.php @@ -15,7 +15,7 @@ use Drupal\Core\Config\StorageInterface; use Drupal\Core\Entity\EntityManager; use Drupal\Core\Extension\ModuleHandler; -use Drupal\Core\KeyValueStore\KeyValueStoreInterface; +use Drupal\Core\KeyValueStore\StateInterface; /** * Controller class for field instances. @@ -44,7 +44,7 @@ class FieldInstanceStorageController extends ConfigStorageController { /** * The state keyvalue collection. * - * @var \Drupal\Core\KeyValueStore\KeyValueStoreInterface + * @var \Drupal\Core\KeyValueStore\StateInterface */ protected $state; @@ -63,10 +63,10 @@ class FieldInstanceStorageController extends ConfigStorageController { * The entity manager. * @param \Drupal\Core\Extension\ModuleHandler $module_handler * The module handler. - * @param \Drupal\Core\KeyValueStore\KeyValueStoreInterface $state + * @param \Drupal\Core\KeyValueStore\StateInterface $state * The state key value store. */ - public function __construct($entity_type, array $entity_info, ConfigFactory $config_factory, StorageInterface $config_storage, QueryFactory $entity_query_factory, EntityManager $entity_manager, ModuleHandler $module_handler, KeyValueStoreInterface $state) { + public function __construct($entity_type, array $entity_info, ConfigFactory $config_factory, StorageInterface $config_storage, QueryFactory $entity_query_factory, EntityManager $entity_manager, ModuleHandler $module_handler, StateInterface $state) { parent::__construct($entity_type, $entity_info, $config_factory, $config_storage, $entity_query_factory); $this->entityManager = $entity_manager; $this->moduleHandler = $module_handler; diff --git a/core/modules/field/lib/Drupal/field/FieldStorageController.php b/core/modules/field/lib/Drupal/field/FieldStorageController.php index 08b7a86..3b36c41 100644 --- a/core/modules/field/lib/Drupal/field/FieldStorageController.php +++ b/core/modules/field/lib/Drupal/field/FieldStorageController.php @@ -15,7 +15,7 @@ use Drupal\Core\Config\StorageInterface; use Drupal\Core\Entity\EntityManager; use Drupal\Core\Extension\ModuleHandler; -use Drupal\Core\KeyValueStore\KeyValueStoreInterface; +use Drupal\Core\KeyValueStore\StateInterface; /** * Controller class for fields. @@ -39,7 +39,7 @@ class FieldStorageController extends ConfigStorageController { /** * The state keyvalue collection. * - * @var \Drupal\Core\KeyValueStore\KeyValueStoreInterface + * @var \Drupal\Core\KeyValueStore\StateInterface */ protected $state; @@ -58,10 +58,10 @@ class FieldStorageController extends ConfigStorageController { * The entity manager. * @param \Drupal\Core\Extension\ModuleHandler $module_handler * The module handler. - * @param \Drupal\Core\KeyValueStore\KeyValueStoreInterface $state + * @param \Drupal\Core\KeyValueStore\StateInterface $state * The state key value store. */ - public function __construct($entity_type, array $entity_info, ConfigFactory $config_factory, StorageInterface $config_storage, QueryFactory $entity_query_factory, EntityManager $entity_manager, ModuleHandler $module_handler, KeyValueStoreInterface $state) { + public function __construct($entity_type, array $entity_info, ConfigFactory $config_factory, StorageInterface $config_storage, QueryFactory $entity_query_factory, EntityManager $entity_manager, ModuleHandler $module_handler, StateInterface $state) { parent::__construct($entity_type, $entity_info, $config_factory, $config_storage, $entity_query_factory); $this->entityManager = $entity_manager; diff --git a/core/modules/locale/lib/Drupal/locale/Form/TranslateFormBase.php b/core/modules/locale/lib/Drupal/locale/Form/TranslateFormBase.php index c33da33..ea4c9ce 100644 --- a/core/modules/locale/lib/Drupal/locale/Form/TranslateFormBase.php +++ b/core/modules/locale/lib/Drupal/locale/Form/TranslateFormBase.php @@ -11,7 +11,7 @@ use Drupal\Core\Language\Language; use Drupal\Core\Language\LanguageManager; use Drupal\locale\StringStorageInterface; -use Drupal\Core\KeyValueStore\KeyValueStoreInterface; +use Drupal\Core\KeyValueStore\StateInterface; use Symfony\Component\DependencyInjection\ContainerInterface; /** @@ -31,7 +31,7 @@ /** * The state store. * - * @var \Drupal\Core\KeyValueStore\KeyValueStoreInterface + * @var \Drupal\Core\KeyValueStore\StateInterface */ protected $state; @@ -54,12 +54,12 @@ * * @param \Drupal\locale\StringStorageInterface $locale_storage * The locale storage. - * @param \Drupal\Core\KeyValueStore\KeyValueStoreInterface $state + * @param \Drupal\Core\KeyValueStore\StateInterface $state * The state service. * @param \Drupal\Core\Language\LanguageManager $language_manager * The language manager. */ - public function __construct(StringStorageInterface $locale_storage, KeyValueStoreInterface $state, LanguageManager $language_manager) { + public function __construct(StringStorageInterface $locale_storage, StateInterface $state, LanguageManager $language_manager) { $this->localeStorage = $locale_storage; $this->state = $state; $this->languageManager = $language_manager; diff --git a/core/modules/node/lib/Drupal/node/Plugin/Search/NodeSearch.php b/core/modules/node/lib/Drupal/node/Plugin/Search/NodeSearch.php index bf987e6..a8d26cd 100644 --- a/core/modules/node/lib/Drupal/node/Plugin/Search/NodeSearch.php +++ b/core/modules/node/lib/Drupal/node/Plugin/Search/NodeSearch.php @@ -14,7 +14,7 @@ use Drupal\Core\Entity\EntityInterface; use Drupal\Core\Entity\EntityManager; use Drupal\Core\Extension\ModuleHandlerInterface; -use Drupal\Core\KeyValueStore\KeyValueStoreInterface; +use Drupal\Core\KeyValueStore\StateInterface; use Drupal\Core\Language\Language; use Drupal\Core\Session\AccountInterface; use Drupal\Core\TypedData\AccessibleInterface; @@ -67,7 +67,7 @@ class NodeSearch extends SearchPluginBase implements AccessibleInterface, Search /** * The Drupal state object used to set 'node.cron_last'. * - * @var \Drupal\Core\KeyValueStore\KeyValueStoreInterface + * @var \Drupal\Core\KeyValueStore\StateInterface */ protected $state; @@ -110,7 +110,7 @@ static public function create(ContainerInterface $container, array $configuratio $container->get('plugin.manager.entity'), $container->get('module_handler'), $container->get('config.factory')->get('search.settings'), - $container->get('keyvalue')->get('state'), + $container->get('state'), $container->get('request')->attributes->get('_account') ); } @@ -132,12 +132,12 @@ static public function create(ContainerInterface $container, array $configuratio * A module manager object. * @param \Drupal\Core\Config\Config $search_settings * A config object for 'search.settings'. - * @param \Drupal\Core\KeyValueStore\KeyValueStoreInterface $state + * @param \Drupal\Core\KeyValueStore\StateInterface $state * The Drupal state object used to set 'node.cron_last'. * @param \Drupal\Core\Session\AccountInterface $account * The $account object to use for checking for access to advanced search. */ - public function __construct(array $configuration, $plugin_id, array $plugin_definition, Connection $database, EntityManager $entity_manager, ModuleHandlerInterface $module_handler, Config $search_settings, KeyValueStoreInterface $state, AccountInterface $account = NULL) { + public function __construct(array $configuration, $plugin_id, array $plugin_definition, Connection $database, EntityManager $entity_manager, ModuleHandlerInterface $module_handler, Config $search_settings, StateInterface $state, AccountInterface $account = NULL) { $this->database = $database; $this->entityManager = $entity_manager; $this->moduleHandler = $module_handler; diff --git a/core/modules/search/lib/Drupal/search/Form/SearchSettingsForm.php b/core/modules/search/lib/Drupal/search/Form/SearchSettingsForm.php index bf37009..01508cb 100644 --- a/core/modules/search/lib/Drupal/search/Form/SearchSettingsForm.php +++ b/core/modules/search/lib/Drupal/search/Form/SearchSettingsForm.php @@ -9,7 +9,7 @@ use Drupal\Core\Config\ConfigFactory; use Drupal\Core\Config\Context\ContextInterface; use Drupal\Core\Extension\ModuleHandlerInterface; -use Drupal\Core\KeyValueStore\KeyValueStoreInterface; +use Drupal\Core\KeyValueStore\StateInterface; use Drupal\search\SearchPluginManager; use Drupal\Core\Form\ConfigFormBase; use Symfony\Component\DependencyInjection\ContainerInterface; @@ -43,7 +43,7 @@ class SearchSettingsForm extends ConfigFormBase { /** * The Drupal state storage service. * - * @var \Drupal\Core\KeyValueStore\KeyValueStoreInterface + * @var \Drupal\Core\KeyValueStore\StateInterface */ protected $state; @@ -58,10 +58,10 @@ class SearchSettingsForm extends ConfigFormBase { * The manager for search plugins. * @param \Drupal\Core\Extension\ModuleHandlerInterface $module_handler * The module handler - * @param \Drupal\Core\KeyValueStore\KeyValueStoreInterface $state + * @param \Drupal\Core\KeyValueStore\StateInterface $state * The state key/value store interface, gives access to state based config settings. */ - public function __construct(ConfigFactory $config_factory, ContextInterface $context, SearchPluginManager $manager, ModuleHandlerInterface $module_handler, KeyValueStoreInterface $state) { + public function __construct(ConfigFactory $config_factory, ContextInterface $context, SearchPluginManager $manager, ModuleHandlerInterface $module_handler, StateInterface $state) { parent::__construct($config_factory, $context); $this->searchSettings = $config_factory->get('search.settings'); $this->searchPluginManager = $manager; diff --git a/core/modules/system/lib/Drupal/system/Form/CronForm.php b/core/modules/system/lib/Drupal/system/Form/CronForm.php index 12802e4..8ddc297 100644 --- a/core/modules/system/lib/Drupal/system/Form/CronForm.php +++ b/core/modules/system/lib/Drupal/system/Form/CronForm.php @@ -9,7 +9,7 @@ use Drupal\Core\Config\ConfigFactory; use Drupal\Core\Config\Context\ContextInterface; -use Drupal\Core\KeyValueStore\KeyValueStoreInterface; +use Drupal\Core\KeyValueStore\StateInterface; use Drupal\Core\Form\ConfigFormBase; use Symfony\Component\DependencyInjection\ContainerInterface; use Symfony\Component\HttpFoundation\RedirectResponse; @@ -22,7 +22,7 @@ class CronForm extends ConfigFormBase { /** * Stores the state storage service. * - * @var \Drupal\Core\KeyValueStore\KeyValueStoreInterface + * @var \Drupal\Core\KeyValueStore\StateInterface */ protected $state; @@ -33,10 +33,10 @@ class CronForm extends ConfigFormBase { * The factory for configuration objects. * @param \Drupal\Core\Config\Context\ContextInterface $context * The configuration context used for this configuration object. - * @param \Drupal\Core\KeyValueStore\KeyValueStoreInterface $state + * @param \Drupal\Core\KeyValueStore\StateInterface $state * The state key value store. */ - public function __construct(ConfigFactory $config_factory, ContextInterface $context, KeyValueStoreInterface $state) { + public function __construct(ConfigFactory $config_factory, ContextInterface $context, StateInterface $state) { parent::__construct($config_factory, $context); $this->state = $state; } diff --git a/core/modules/system/lib/Drupal/system/Form/SiteMaintenanceModeForm.php b/core/modules/system/lib/Drupal/system/Form/SiteMaintenanceModeForm.php index 131af5b..86e012d 100644 --- a/core/modules/system/lib/Drupal/system/Form/SiteMaintenanceModeForm.php +++ b/core/modules/system/lib/Drupal/system/Form/SiteMaintenanceModeForm.php @@ -9,7 +9,7 @@ use Drupal\Core\Config\ConfigFactory; use Drupal\Core\Config\Context\ContextInterface; -use Drupal\Core\KeyValueStore\KeyValueStoreInterface; +use Drupal\Core\KeyValueStore\StateInterface; use Drupal\Core\Form\ConfigFormBase; use Symfony\Component\DependencyInjection\ContainerInterface; @@ -21,7 +21,7 @@ class SiteMaintenanceModeForm extends ConfigFormBase { /** * The state keyvalue collection. * - * @var \Drupal\Core\KeyValueStore\KeyValueStoreInterface + * @var \Drupal\Core\KeyValueStore\StateInterface */ protected $state; @@ -32,10 +32,10 @@ class SiteMaintenanceModeForm extends ConfigFormBase { * The factory for configuration objects. * @param \Drupal\Core\Config\Context\ContextInterface $context * The configuration context to use. - * @param \Drupal\Core\KeyValueStore\KeyValueStoreInterface $state + * @param \Drupal\Core\KeyValueStore\StateInterface $state * The state keyvalue collection to use. */ - public function __construct(ConfigFactory $config_factory, ContextInterface $context, KeyValueStoreInterface $state) { + public function __construct(ConfigFactory $config_factory, ContextInterface $context, StateInterface $state) { parent::__construct($config_factory, $context); $this->state = $state; } diff --git a/core/modules/system/tests/modules/service_provider_test/lib/Drupal/service_provider_test/TestClass.php b/core/modules/system/tests/modules/service_provider_test/lib/Drupal/service_provider_test/TestClass.php index 1c8ea06..9078493 100644 --- a/core/modules/system/tests/modules/service_provider_test/lib/Drupal/service_provider_test/TestClass.php +++ b/core/modules/system/tests/modules/service_provider_test/lib/Drupal/service_provider_test/TestClass.php @@ -7,7 +7,7 @@ namespace Drupal\service_provider_test; -use Drupal\Core\KeyValueStore\KeyValueStoreInterface; +use Drupal\Core\KeyValueStore\StateInterface; use Drupal\Core\DestructableInterface; use Symfony\Component\EventDispatcher\EventSubscriberInterface; use Symfony\Component\HttpKernel\Event\GetResponseEvent; @@ -18,17 +18,17 @@ class TestClass implements EventSubscriberInterface, DestructableInterface { /** * The state keyvalue collection. * - * @var \Drupal\Core\KeyValueStore\KeyValueStoreInterface + * @var \Drupal\Core\KeyValueStore\StateInterface */ protected $state; /** * Constructor. * - * @param \Drupal\Core\KeyValueStore\KeyValueStoreInterface $state + * @param \Drupal\Core\KeyValueStore\StateInterface $state * The state key value store. */ - public function __construct(KeyValueStoreInterface $state) { + public function __construct(StateInterface $state) { $this->state = $state; }