<?php
/*
* This file is part of the Assetic package, an OpenSky project.
*
* (c) 2010-2013 OpenSky Project Inc
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Assetic\Asset;
use Assetic\Cache\CacheInterface;
use Assetic\Filter\FilterInterface;
use Assetic\Filter\HashableInterface;
/**
* Caches an asset to avoid the cost of loading and dumping.
*
* @author Kris Wallsmith <kris.wallsmith@gmail.com>
*/
class AssetCache implements AssetInterface {
private $asset;
private $cache;
public function __construct(AssetInterface $asset, CacheInterface $cache) {
$this->asset = $asset;
$this->cache = $cache;
}
public function ensureFilter(FilterInterface $filter) {
$this->asset
->ensureFilter($filter);
}
public function getFilters() {
return $this->asset
->getFilters();
}
public function clearFilters() {
$this->asset
->clearFilters();
}
public function load(FilterInterface $additionalFilter = null) {
$cacheKey = self::getCacheKey($this->asset, $additionalFilter, 'load');
if ($this->cache
->has($cacheKey)) {
$this->asset
->setContent($this->cache
->get($cacheKey));
return;
}
$this->asset
->load($additionalFilter);
$this->cache
->set($cacheKey, $this->asset
->getContent());
}
public function dump(FilterInterface $additionalFilter = null) {
$cacheKey = self::getCacheKey($this->asset, $additionalFilter, 'dump');
if ($this->cache
->has($cacheKey)) {
return $this->cache
->get($cacheKey);
}
$content = $this->asset
->dump($additionalFilter);
$this->cache
->set($cacheKey, $content);
return $content;
}
public function getContent() {
return $this->asset
->getContent();
}
public function setContent($content) {
$this->asset
->setContent($content);
}
public function getSourceRoot() {
return $this->asset
->getSourceRoot();
}
public function getSourcePath() {
return $this->asset
->getSourcePath();
}
public function getTargetPath() {
return $this->asset
->getTargetPath();
}
public function setTargetPath($targetPath) {
$this->asset
->setTargetPath($targetPath);
}
public function getLastModified() {
return $this->asset
->getLastModified();
}
public function getVars() {
return $this->asset
->getVars();
}
public function setValues(array $values) {
$this->asset
->setValues($values);
}
public function getValues() {
return $this->asset
->getValues();
}
/**
* Returns a cache key for the current asset.
*
* The key is composed of everything but an asset's content:
*
* * source root
* * source path
* * target url
* * last modified
* * filters
*
* @param AssetInterface $asset The asset
* @param FilterInterface $additionalFilter Any additional filter being applied
* @param string $salt Salt for the key
*
* @return string A key for identifying the current asset
*/
private static function getCacheKey(AssetInterface $asset, FilterInterface $additionalFilter = null, $salt = '') {
if ($additionalFilter) {
$asset = clone $asset;
$asset
->ensureFilter($additionalFilter);
}
$cacheKey = $asset
->getSourceRoot();
$cacheKey .= $asset
->getSourcePath();
$cacheKey .= $asset
->getTargetPath();
$cacheKey .= $asset
->getLastModified();
foreach ($asset
->getFilters() as $filter) {
if ($filter instanceof HashableInterface) {
$cacheKey .= $filter
->hash();
}
else {
$cacheKey .= serialize($filter);
}
}
if ($values = $asset
->getValues()) {
asort($values);
$cacheKey .= serialize($values);
}
return md5($cacheKey . $salt);
}
}
Name | Description |
---|---|
AssetCache | Caches an asset to avoid the cost of loading and dumping. |