1<?php 2 3namespace Drupal\locale; 4 5use Drupal\Core\KeyValueStore\KeyValueFactoryInterface; 6 7/** 8 * Provides the locale project storage system using a key value store. 9 */ 10class LocaleProjectStorage implements LocaleProjectStorageInterface { 11 12 /** 13 * The key value store to use. 14 * 15 * @var \Drupal\Core\KeyValueStore\KeyValueStoreInterface 16 */ 17 protected $keyValueStore; 18 19 /** 20 * Static state cache. 21 * 22 * @var array 23 */ 24 protected $cache = []; 25 26 /** 27 * Cache status flag. 28 * 29 * @var bool 30 */ 31 protected static $all = FALSE; 32 33 /** 34 * Constructs a State object. 35 * 36 * @param \Drupal\Core\KeyValueStore\KeyValueFactoryInterface $key_value_factory 37 * The key value store to use. 38 */ 39 public function __construct(KeyValueFactoryInterface $key_value_factory) { 40 $this->keyValueStore = $key_value_factory->get('locale.project'); 41 } 42 43 /** 44 * {@inheritdoc} 45 */ 46 public function get($key, $default = NULL) { 47 $values = $this->getMultiple([$key]); 48 return isset($values[$key]) ? $values[$key] : $default; 49 } 50 51 /** 52 * {@inheritdoc} 53 */ 54 public function getMultiple(array $keys) { 55 $values = []; 56 $load = []; 57 foreach ($keys as $key) { 58 // Check if we have a value in the cache. 59 if (isset($this->cache[$key])) { 60 $values[$key] = $this->cache[$key]; 61 } 62 // Load the value if we don't have an explicit NULL value. 63 elseif (!array_key_exists($key, $this->cache)) { 64 $load[] = $key; 65 } 66 } 67 68 if ($load) { 69 $loaded_values = $this->keyValueStore->getMultiple($load); 70 foreach ($load as $key) { 71 // If we find a value, even one that is NULL, add it to the cache and 72 // return it. 73 if (isset($loaded_values[$key])) { 74 $values[$key] = $loaded_values[$key]; 75 $this->cache[$key] = $loaded_values[$key]; 76 } 77 else { 78 $this->cache[$key] = NULL; 79 } 80 } 81 } 82 83 return $values; 84 } 85 86 /** 87 * {@inheritdoc} 88 */ 89 public function set($key, $value) { 90 $this->setMultiple([$key => $value]); 91 } 92 93 /** 94 * {@inheritdoc} 95 */ 96 public function setMultiple(array $data) { 97 foreach ($data as $key => $value) { 98 $this->cache[$key] = $value; 99 } 100 $this->keyValueStore->setMultiple($data); 101 } 102 103 /** 104 * {@inheritdoc} 105 */ 106 public function delete($key) { 107 $this->deleteMultiple([$key]); 108 } 109 110 /** 111 * {@inheritdoc} 112 */ 113 public function deleteMultiple(array $keys) { 114 foreach ($keys as $key) { 115 $this->cache[$key] = NULL; 116 } 117 $this->keyValueStore->deleteMultiple($keys); 118 } 119 120 /** 121 * {@inheritdoc} 122 */ 123 public function resetCache() { 124 $this->cache = []; 125 static::$all = FALSE; 126 } 127 128 /** 129 * {@inheritdoc} 130 */ 131 public function deleteAll() { 132 $this->keyValueStore->deleteAll(); 133 $this->resetCache(); 134 } 135 136 /** 137 * {@inheritdoc} 138 */ 139 public function disableAll() { 140 $projects = $this->keyValueStore->getAll(); 141 foreach (array_keys($projects) as $key) { 142 $projects[$key]['status'] = 0; 143 if (isset($cache[$key])) { 144 $cache[$key] = $projects[$key]; 145 } 146 } 147 $this->keyValueStore->setMultiple($projects); 148 149 } 150 151 /** 152 * {@inheritdoc} 153 */ 154 public function countProjects() { 155 return count($this->getAll()); 156 } 157 158 /** 159 * {@inheritdoc} 160 */ 161 public function getAll() { 162 if (!static::$all) { 163 $this->cache = $this->keyValueStore->getAll(); 164 static::$all = TRUE; 165 } 166 return $this->cache; 167 } 168 169} 170