You are here

final class DistroStorageManager in Config Distro 8

The distro storage manager dispatches an event for the distro storage.

This class is not meant to be extended and is final to make sure the constructor and the getStorage method are both changed when this pattern is used in other circumstances.

Hierarchy

Expanded class hierarchy of DistroStorageManager

1 string reference to 'DistroStorageManager'
config_distro.services.yml in ./config_distro.services.yml
config_distro.services.yml
1 service uses DistroStorageManager
config_distro.storage.distro.manager in ./config_distro.services.yml
Drupal\config_distro\DistroStorageManager

File

src/DistroStorageManager.php, line 24

Namespace

Drupal\config_distro
View source
final class DistroStorageManager implements StorageManagerInterface {
  use StorageCopyTrait;

  /**
   * The name used to identify the lock.
   */
  const LOCK_NAME = 'distro_storage_manager';

  /**
   * The active configuration storage.
   *
   * @var \Drupal\Core\Config\StorageInterface
   */
  protected $active;

  /**
   * The database storage.
   *
   * @var \Drupal\Core\Config\DatabaseStorage
   */
  protected $storage;

  /**
   * The event dispatcher.
   *
   * @var \Symfony\Component\EventDispatcher\EventDispatcherInterface
   */
  protected $eventDispatcher;

  /**
   * The used lock backend instance.
   *
   * @var \Drupal\Core\Lock\LockBackendInterface
   */
  protected $lock;

  /**
   * DistroStorageManager constructor.
   *
   * @param \Drupal\Core\Config\StorageInterface $active
   *   The active config storage to prime the export storage.
   * @param \Symfony\Component\EventDispatcher\EventDispatcherInterface $event_dispatcher
   *   The event dispatcher.
   * @param \Drupal\Core\Lock\LockBackendInterface $lock
   *   The used lock backend instance.
   */
  public function __construct(StorageInterface $active, EventDispatcherInterface $event_dispatcher, LockBackendInterface $lock) {
    $this->active = $active;
    $this->eventDispatcher = $event_dispatcher;
    $this->lock = $lock;

    // The point of this service is to provide the storage and dispatch the
    // event when needed, so the storage itself can not be a service.
    $this->storage = new MemoryStorage();
  }

  /**
   * {@inheritdoc}
   */
  public function getStorage() {

    // Acquire a lock for the request to assert that the storage does not change
    // when a concurrent request transforms the storage.
    if (!$this->lock
      ->acquire(self::LOCK_NAME)) {
      $this->lock
        ->wait(self::LOCK_NAME);
      if (!$this->lock
        ->acquire(self::LOCK_NAME)) {
        throw new StorageTransformerException("Cannot acquire config distro transformer lock.");
      }
    }
    self::replaceStorageContents($this->active, $this->storage);
    $this->eventDispatcher
      ->dispatch(ConfigDistroEvents::TRANSFORM, new DistroStorageTransformEvent($this->storage));
    return new ReadOnlyStorage($this->storage);
  }

}

Members

Namesort descending Modifiers Type Description Overrides
DistroStorageManager::$active protected property The active configuration storage.
DistroStorageManager::$eventDispatcher protected property The event dispatcher.
DistroStorageManager::$lock protected property The used lock backend instance.
DistroStorageManager::$storage protected property The database storage.
DistroStorageManager::getStorage public function Get the config storage. Overrides StorageManagerInterface::getStorage
DistroStorageManager::LOCK_NAME constant The name used to identify the lock.
DistroStorageManager::__construct public function DistroStorageManager constructor.
StorageCopyTrait::replaceStorageContents protected static function Copy the configuration from one storage to another and remove stale items.