class LocaleProjectStorage

Same name and namespace in other branches
  1. 9 core/modules/locale/src/LocaleProjectStorage.php \Drupal\locale\LocaleProjectStorage
  2. 8.9.x core/modules/locale/src/LocaleProjectStorage.php \Drupal\locale\LocaleProjectStorage
  3. 11.x core/modules/locale/src/LocaleProjectStorage.php \Drupal\locale\LocaleProjectStorage

Provides the locale project storage system using a key value store.

Hierarchy

Expanded class hierarchy of LocaleProjectStorage

1 file declares its use of LocaleProjectStorage
LocaleProjectStorageTest.php in core/modules/locale/tests/src/Unit/LocaleProjectStorageTest.php
1 string reference to 'LocaleProjectStorage'
locale.services.yml in core/modules/locale/locale.services.yml
core/modules/locale/locale.services.yml
1 service uses LocaleProjectStorage
locale.project in core/modules/locale/locale.services.yml
Drupal\locale\LocaleProjectStorage

File

core/modules/locale/src/LocaleProjectStorage.php, line 10

Namespace

Drupal\locale
View source
class LocaleProjectStorage implements LocaleProjectStorageInterface {
  
  /**
   * The key value store to use.
   *
   * @var \Drupal\Core\KeyValueStore\KeyValueStoreInterface
   */
  protected $keyValueStore;
  
  /**
   * Static state cache.
   *
   * @var array
   */
  protected $cache = [];
  
  /**
   * Cache status flag.
   *
   * @var bool
   */
  protected bool $all = FALSE;
  
  /**
   * Sorted status flag.
   *
   * @var bool
   */
  protected bool $sorted = FALSE;
  
  /**
   * Constructs a State object.
   *
   * @param \Drupal\Core\KeyValueStore\KeyValueFactoryInterface $key_value_factory
   *   The key value store to use.
   */
  public function __construct(KeyValueFactoryInterface $key_value_factory) {
    $this->keyValueStore = $key_value_factory->get('locale.project');
  }
  
  /**
   * {@inheritdoc}
   */
  public function get($key, $default = NULL) {
    $values = $this->getMultiple([
      $key,
    ]);
    return $values[$key] ?? $default;
  }
  
  /**
   * {@inheritdoc}
   */
  public function getMultiple(array $keys) {
    $values = [];
    $load = [];
    foreach ($keys as $key) {
      // Check if we have a value in the cache.
      if (isset($this->cache[$key])) {
        $values[$key] = $this->cache[$key];
      }
      elseif (!array_key_exists($key, $this->cache)) {
        $load[] = $key;
      }
    }
    if ($load) {
      $loaded_values = $this->keyValueStore
        ->getMultiple($load);
      foreach ($load as $key) {
        // If we find a value, even one that is NULL, add it to the cache and
        // return it.
        if (isset($loaded_values[$key])) {
          $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->setMultiple([
      $key => $value,
    ]);
  }
  
  /**
   * {@inheritdoc}
   */
  public function setMultiple(array $data) {
    foreach ($data as $key => $value) {
      $this->cache[$key] = $value;
    }
    $this->keyValueStore
      ->setMultiple($data);
    $this->sorted = FALSE;
  }
  
  /**
   * {@inheritdoc}
   */
  public function delete($key) {
    $this->deleteMultiple([
      $key,
    ]);
  }
  
  /**
   * {@inheritdoc}
   */
  public function deleteMultiple(array $keys) {
    foreach ($keys as $key) {
      $this->cache[$key] = NULL;
    }
    $this->keyValueStore
      ->deleteMultiple($keys);
  }
  
  /**
   * {@inheritdoc}
   */
  public function resetCache() {
    $this->cache = [];
    $this->sorted = $this->all = FALSE;
  }
  
  /**
   * {@inheritdoc}
   */
  public function deleteAll() {
    $this->keyValueStore
      ->deleteAll();
    $this->resetCache();
  }
  
  /**
   * {@inheritdoc}
   */
  public function disableAll() {
    $projects = $this->keyValueStore
      ->getAll();
    foreach (array_keys($projects) as $key) {
      $projects[$key]['status'] = 0;
      if (isset($this->cache[$key])) {
        $this->cache[$key] = $projects[$key];
      }
    }
    $this->keyValueStore
      ->setMultiple($projects);
  }
  
  /**
   * {@inheritdoc}
   */
  public function countProjects() {
    return count($this->getAll());
  }
  
  /**
   * {@inheritdoc}
   */
  public function getAll() {
    if (!$this->all) {
      $this->cache = $this->keyValueStore
        ->getAll();
      $this->all = TRUE;
    }
    if (!$this->sorted) {
      // Work around PHP 8.3.0 - 8.3.3 bug by assigning $this->cache to a local
      // variable, see https://github.com/php/php-src/pull/13285.
      $cache = $this->cache;
      uksort($this->cache, function ($a, $b) use ($cache) {
        // Sort by weight, if available, and then by key. This allows locale
        // projects to set a weight, if required, and keeps the order consistent
        // regardless of whether the list is built from code or retrieve from
        // the database.
        $sort = (int) ($cache[$a]['weight'] ?? 0) <=> (int) ($cache[$b]['weight'] ?? 0);
        return $sort ?: strcmp($a, $b);
      });
      $this->sorted = TRUE;
    }
    // Remove any NULL values as these are not valid projects.
    return array_filter($this->cache, fn($value) => $value !== NULL);
  }

}

Members

Title Sort descending Modifiers Object type Summary Overriden Title
LocaleProjectStorage::$all protected property Cache status flag.
LocaleProjectStorage::$cache protected property Static state cache.
LocaleProjectStorage::$keyValueStore protected property The key value store to use.
LocaleProjectStorage::$sorted protected property Sorted status flag.
LocaleProjectStorage::countProjects public function Returns the count of project records. Overrides LocaleProjectStorageInterface::countProjects
LocaleProjectStorage::delete public function Deletes project records for a given key. Overrides LocaleProjectStorageInterface::delete
LocaleProjectStorage::deleteAll public function Deletes all projects records. Overrides LocaleProjectStorageInterface::deleteAll
LocaleProjectStorage::deleteMultiple public function Deletes multiple project records. Overrides LocaleProjectStorageInterface::deleteMultiple
LocaleProjectStorage::disableAll public function Mark all projects as disabled. Overrides LocaleProjectStorageInterface::disableAll
LocaleProjectStorage::get public function Returns the stored value for a given key. Overrides LocaleProjectStorageInterface::get
LocaleProjectStorage::getAll public function Returns all the project records. Overrides LocaleProjectStorageInterface::getAll
LocaleProjectStorage::getMultiple public function Returns a list of project records. Overrides LocaleProjectStorageInterface::getMultiple
LocaleProjectStorage::resetCache public function Resets the project storage cache. Overrides LocaleProjectStorageInterface::resetCache
LocaleProjectStorage::set public function Creates or updates the project record. Overrides LocaleProjectStorageInterface::set
LocaleProjectStorage::setMultiple public function Creates or updates multiple project records. Overrides LocaleProjectStorageInterface::setMultiple
LocaleProjectStorage::__construct public function Constructs a State object.

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.