dcache-1.0.x-dev/src/DCache.php

src/DCache.php
<?php

declare(strict_types=1);

namespace Drupal\dcache;;

use Drupal\Core\Cache\Cache;
use Drupal\Core\Cache\CacheBackendInterface;

final class DCache implements DCacheInterface {

  /**
   * @var array<\Drupal\Core\Cache\CacheBackendInterface>
   */
  protected array $cacheBackends;

  private function __construct(array $cacheBackends) {
    $this->cacheBackends = $cacheBackends;
  }

  public static function create(CacheBackendInterface ...$cacheBackends) {
    return new static($cacheBackends);
  }

  public function lookupOrGenerate(CacheItemGeneratorInterface $generator) {
    return $this->doLookupOrGenerate($this->cacheBackends, $generator);
  }

  protected function doLookupOrGenerate(array $cacheBackends, CacheItemGeneratorInterface $generator) {
    if ($cacheBackends) {
      $cacheBackend = reset($cacheBackends);
      $cacheId = $generator->getCacheId();
      if ($cached = $cacheBackend->get($cacheId)) {
        return $cached->data;
      }
      else {
        $data = $this->doLookupOrGenerate(array_slice($cacheBackends, 1), $generator);
        $cacheBackend->set($cacheId, $data, Cache::PERMANENT, $generator->getCacheTags());
        return $data;
      }
    }
    else {
      return $generator->getData();
    }
  }

  /**
   * @param \Drupal\dcache\CacheItemListGeneratorInterface $itemListGenerator
   */
  public function lookupOrGenerateMultiple(CacheItemListGeneratorInterface $itemListGenerator): CacheItemList {
    return $this->doLookupOrGenerateMultiple($this->cacheBackends, $itemListGenerator);
  }

  /**
   * @param array<CacheBackendInterface> $cacheBackends
   */
  protected function doLookupOrGenerateMultiple(array $cacheBackends, CacheItemListGeneratorInterface $itemListGenerator): CacheItemList {
    if ($cacheBackends) {
      $cacheBackend = reset($cacheBackends);
      $cids = $itemListGenerator->getCacheIds();
      $items = CacheItemList::fromArraysByCacheId($cacheBackend->getMultiple($cids));
      // $cids now has the successfully fetched elements removed.
      if ($cids) {
        $missingItemsGenerator = $itemListGenerator->withCacheIds($cids);
        $missingItems = $this->doLookupOrGenerateMultiple(array_slice($cacheBackends, 1), $missingItemsGenerator);
        $cacheBackend->setMultiple($missingItems->toArraysByCacheId());
        $items->extend($missingItems);
      }
      return $items;
    }
    else {
      return $itemListGenerator->generateCacheItemList();
    }
  }

}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc