class LinearHistory

Same name and namespace in other branches
  1. 11.x core/lib/Drupal/Core/Config/Checkpoint/LinearHistory.php \Drupal\Core\Config\Checkpoint\LinearHistory

A chronological list of Checkpoint objects.

@internal This API is experimental.

Hierarchy

Expanded class hierarchy of LinearHistory

2 files declare their use of LinearHistory
CheckpointStorageTest.php in core/tests/Drupal/Tests/Core/Config/Checkpoint/CheckpointStorageTest.php
LinearHistoryTest.php in core/tests/Drupal/Tests/Core/Config/Checkpoint/LinearHistoryTest.php
1 string reference to 'LinearHistory'
core.services.yml in core/core.services.yml
core/core.services.yml
1 service uses LinearHistory
config.checkpoints in core/core.services.yml
Drupal\Core\Config\Checkpoint\LinearHistory

File

core/lib/Drupal/Core/Config/Checkpoint/LinearHistory.php, line 16

Namespace

Drupal\Core\Config\Checkpoint
View source
final class LinearHistory implements CheckpointListInterface {
  
  /**
   * The store of all the checkpoint names in state.
   */
  private const CHECKPOINT_KEY = 'config.checkpoints';
  
  /**
   * The active checkpoint.
   *
   * In our implementation this is always the last in the list.
   *
   * @var \Drupal\Core\Config\Checkpoint\Checkpoint|null
   */
  private ?Checkpoint $activeCheckpoint;
  
  /**
   * The list of checkpoints, keyed by ID.
   *
   * @var \Drupal\Core\Config\Checkpoint\Checkpoint[]
   */
  private array $checkpoints;
  
  /**
   * Constructs a checkpoints object.
   *
   * @param \Drupal\Core\State\StateInterface $state
   *   The state service.
   * @param \Drupal\Component\Datetime\TimeInterface $time
   *   The time service.
   */
  public function __construct(private readonly StateInterface $state, private readonly TimeInterface $time) {
    $this->checkpoints = $this->state
      ->get(self::CHECKPOINT_KEY, []);
    $this->activeCheckpoint = end($this->checkpoints) ?: NULL;
  }
  
  /**
   * {@inheritdoc}
   */
  public function getActiveCheckpoint() : ?Checkpoint {
    return $this->activeCheckpoint;
  }
  
  /**
   * {@inheritdoc}
   */
  public function get(string $id) : Checkpoint {
    if (!isset($this->checkpoints[$id])) {
      throw new UnknownCheckpointException(sprintf('The checkpoint "%s" does not exist', $id));
    }
    return $this->checkpoints[$id];
  }
  
  /**
   * {@inheritdoc}
   */
  public function getParents(string $id) : \Traversable {
    if (!isset($this->checkpoints[$id])) {
      throw new UnknownCheckpointException(sprintf('The checkpoint "%s" does not exist', $id));
    }
    $checkpoint = $this->checkpoints[$id];
    while ($checkpoint->parent !== NULL) {
      $checkpoint = $this->get($checkpoint->parent);
      (yield $checkpoint->id => $checkpoint);
    }
  }
  
  /**
   * {@inheritdoc}
   */
  public function getIterator() : \Traversable {
    return new \ArrayIterator($this->checkpoints);
  }
  
  /**
   * {@inheritdoc}
   */
  public function count() : int {
    return count($this->checkpoints);
  }
  
  /**
   * {@inheritdoc}
   */
  public function add(string $id, string|\Stringable $label) : Checkpoint {
    if (isset($this->checkpoints[$id])) {
      throw new CheckpointExistsException(sprintf('Cannot create a checkpoint with the ID "%s" as it already exists', $id));
    }
    $checkpoint = new Checkpoint($id, $label, $this->time
      ->getCurrentTime(), $this->activeCheckpoint?->id);
    $this->checkpoints[$checkpoint->id] = $checkpoint;
    $this->activeCheckpoint = $checkpoint;
    $this->state
      ->set(self::CHECKPOINT_KEY, $this->checkpoints);
    return $checkpoint;
  }
  
  /**
   * {@inheritdoc}
   */
  public function delete(string $id) : static {
    if (!isset($this->checkpoints[$id])) {
      throw new UnknownCheckpointException(sprintf('Cannot delete a checkpoint with the ID "%s" as it does not exist', $id));
    }
    foreach ($this->checkpoints as $key => $checkpoint) {
      unset($this->checkpoints[$key]);
      if ($checkpoint->id === $id) {
        break;

      }
    }
    $this->state
      ->set(self::CHECKPOINT_KEY, $this->checkpoints);
    return $this;
  }
  
  /**
   * {@inheritdoc}
   */
  public function deleteAll() : static {
    $this->checkpoints = [];
    $this->activeCheckpoint = NULL;
    $this->state
      ->delete(self::CHECKPOINT_KEY);
    return $this;
  }

}

Members

Title Sort descending Modifiers Object type Summary Overriden Title
LinearHistory::$activeCheckpoint private property The active checkpoint.
LinearHistory::$checkpoints private property The list of checkpoints, keyed by ID.
LinearHistory::add public function Adds a new checkpoint. Overrides CheckpointListInterface::add
LinearHistory::CHECKPOINT_KEY private constant The store of all the checkpoint names in state.
LinearHistory::count public function
LinearHistory::delete public function Deletes a checkpoint. Overrides CheckpointListInterface::delete
LinearHistory::deleteAll public function Deletes all checkpoints. Overrides CheckpointListInterface::deleteAll
LinearHistory::get public function Gets a checkpoint. Overrides CheckpointListInterface::get
LinearHistory::getActiveCheckpoint public function Gets the active checkpoint. Overrides CheckpointListInterface::getActiveCheckpoint
LinearHistory::getIterator public function
LinearHistory::getParents public function Gets a checkpoint's parents. Overrides CheckpointListInterface::getParents
LinearHistory::__construct public function Constructs a checkpoints object.

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