. */ namespace Doctrine\Common\Cache; /** * Cache provider that allows to easily chain multiple cache providers * * @author Michaƫl Gallego */ class ChainCache extends CacheProvider { /** * @var CacheProvider[] */ private $cacheProviders = array(); /** * Constructor * * @param CacheProvider[] $cacheProviders */ public function __construct($cacheProviders = array()) { $this->cacheProviders = $cacheProviders; } /** * {@inheritDoc} */ public function setNamespace($namespace) { parent::setNamespace($namespace); foreach ($this->cacheProviders as $cacheProvider) { $cacheProvider->setNamespace($namespace); } } /** * {@inheritDoc} */ protected function doFetch($id) { foreach ($this->cacheProviders as $key => $cacheProvider) { if ($cacheProvider->doContains($id)) { $value = $cacheProvider->doFetch($id); // We populate all the previous cache layers (that are assumed to be faster) for ($subKey = $key - 1 ; $subKey >= 0 ; $subKey--) { $this->cacheProviders[$subKey]->doSave($id, $value); } return $value; } } return false; } /** * {@inheritDoc} */ protected function doContains($id) { foreach ($this->cacheProviders as $cacheProvider) { if ($cacheProvider->doContains($id)) { return true; } } return false; } /** * {@inheritDoc} */ protected function doSave($id, $data, $lifeTime = 0) { $stored = true; foreach ($this->cacheProviders as $cacheProvider) { $stored = $cacheProvider->doSave($id, $data, $lifeTime) && $stored; } return $stored; } /** * {@inheritDoc} */ protected function doDelete($id) { $deleted = true; foreach ($this->cacheProviders as $cacheProvider) { $deleted = $cacheProvider->doDelete($id) && $deleted; } return $deleted; } /** * {@inheritDoc} */ protected function doFlush() { $flushed = true; foreach ($this->cacheProviders as $cacheProvider) { $flushed = $cacheProvider->doFlush() && $flushed; } return $flushed; } /** * {@inheritDoc} */ protected function doGetStats() { // We return all the stats from all adapters $stats = array(); foreach ($this->cacheProviders as $cacheProvider) { $stats[] = $cacheProvider->doGetStats(); } return $stats; } }