Chris@0: backends[] = $backend; Chris@0: Chris@0: return $this; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Prepends a cache backend to the cache chain. Chris@0: * Chris@0: * @param CacheBackendInterface $backend Chris@0: * The backend to be prepended to the cache chain. Chris@0: * Chris@0: * @return \Drupal\Core\Cache\BackendChain Chris@0: * The called object. Chris@0: */ Chris@0: public function prependBackend(CacheBackendInterface $backend) { Chris@0: array_unshift($this->backends, $backend); Chris@0: Chris@0: return $this; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function get($cid, $allow_invalid = FALSE) { Chris@0: foreach ($this->backends as $index => $backend) { Chris@0: if (($return = $backend->get($cid, $allow_invalid)) !== FALSE) { Chris@0: // We found a result, propagate it to all missed backends. Chris@0: if ($index > 0) { Chris@0: for ($i = ($index - 1); 0 <= $i; --$i) { Chris@0: $this->backends[$i]->set($cid, $return->data, $return->expire, $return->tags); Chris@0: } Chris@0: } Chris@0: Chris@0: return $return; Chris@0: } Chris@0: } Chris@0: Chris@0: return FALSE; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function getMultiple(&$cids, $allow_invalid = FALSE) { Chris@0: $return = []; Chris@0: Chris@0: foreach ($this->backends as $index => $backend) { Chris@0: $items = $backend->getMultiple($cids, $allow_invalid); Chris@0: Chris@0: // Propagate the values that could be retrieved from the current cache Chris@0: // backend to all missed backends. Chris@0: if ($index > 0 && !empty($items)) { Chris@0: for ($i = ($index - 1); 0 <= $i; --$i) { Chris@0: foreach ($items as $cached) { Chris@0: $this->backends[$i]->set($cached->cid, $cached->data, $cached->expire, $cached->tags); Chris@0: } Chris@0: } Chris@0: } Chris@0: Chris@0: // Append the values to the previously retrieved ones. Chris@0: $return += $items; Chris@0: Chris@0: if (empty($cids)) { Chris@0: // No need to go further if we don't have any cid to fetch left. Chris@0: break; Chris@0: } Chris@0: } Chris@0: Chris@0: return $return; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function set($cid, $data, $expire = Cache::PERMANENT, array $tags = []) { Chris@0: foreach ($this->backends as $backend) { Chris@0: $backend->set($cid, $data, $expire, $tags); Chris@0: } Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function setMultiple(array $items) { Chris@0: foreach ($this->backends as $backend) { Chris@0: $backend->setMultiple($items); Chris@0: } Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function delete($cid) { Chris@0: foreach ($this->backends as $backend) { Chris@0: $backend->delete($cid); Chris@0: } Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function deleteMultiple(array $cids) { Chris@0: foreach ($this->backends as $backend) { Chris@0: $backend->deleteMultiple($cids); Chris@0: } Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function deleteAll() { Chris@0: foreach ($this->backends as $backend) { Chris@0: $backend->deleteAll(); Chris@0: } Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function invalidate($cid) { Chris@0: foreach ($this->backends as $backend) { Chris@0: $backend->invalidate($cid); Chris@0: } Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function invalidateMultiple(array $cids) { Chris@0: foreach ($this->backends as $backend) { Chris@0: $backend->invalidateMultiple($cids); Chris@0: } Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function invalidateTags(array $tags) { Chris@0: foreach ($this->backends as $backend) { Chris@0: if ($backend instanceof CacheTagsInvalidatorInterface) { Chris@0: $backend->invalidateTags($tags); Chris@0: } Chris@0: } Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function invalidateAll() { Chris@0: foreach ($this->backends as $backend) { Chris@0: $backend->invalidateAll(); Chris@0: } Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function garbageCollection() { Chris@0: foreach ($this->backends as $backend) { Chris@0: $backend->garbageCollection(); Chris@0: } Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function removeBin() { Chris@0: foreach ($this->backends as $backend) { Chris@0: $backend->removeBin(); Chris@0: } Chris@0: } Chris@0: Chris@0: }