vendor/assetic/src/Assetic/Asset/AssetCache.php
changeset 0 7f95f8617b0b
equal deleted inserted replaced
-1:000000000000 0:7f95f8617b0b
       
     1 <?php
       
     2 
       
     3 /*
       
     4  * This file is part of the Assetic package, an OpenSky project.
       
     5  *
       
     6  * (c) 2010-2011 OpenSky Project Inc
       
     7  *
       
     8  * For the full copyright and license information, please view the LICENSE
       
     9  * file that was distributed with this source code.
       
    10  */
       
    11 
       
    12 namespace Assetic\Asset;
       
    13 
       
    14 use Assetic\Cache\CacheInterface;
       
    15 use Assetic\Filter\FilterInterface;
       
    16 
       
    17 /**
       
    18  * Caches an asset to avoid the cost of loading and dumping.
       
    19  *
       
    20  * @author Kris Wallsmith <kris.wallsmith@gmail.com>
       
    21  */
       
    22 class AssetCache implements AssetInterface
       
    23 {
       
    24     private $asset;
       
    25     private $cache;
       
    26 
       
    27     public function __construct(AssetInterface $asset, CacheInterface $cache)
       
    28     {
       
    29         $this->asset = $asset;
       
    30         $this->cache = $cache;
       
    31     }
       
    32 
       
    33     public function ensureFilter(FilterInterface $filter)
       
    34     {
       
    35         $this->asset->ensureFilter($filter);
       
    36     }
       
    37 
       
    38     public function getFilters()
       
    39     {
       
    40         return $this->asset->getFilters();
       
    41     }
       
    42 
       
    43     public function clearFilters()
       
    44     {
       
    45         $this->asset->clearFilters();
       
    46     }
       
    47 
       
    48     public function load(FilterInterface $additionalFilter = null)
       
    49     {
       
    50         $cacheKey = self::getCacheKey($this->asset, $additionalFilter, 'load');
       
    51         if ($this->cache->has($cacheKey)) {
       
    52             $this->asset->setContent($this->cache->get($cacheKey));
       
    53             return;
       
    54         }
       
    55 
       
    56         $this->asset->load($additionalFilter);
       
    57         $this->cache->set($cacheKey, $this->asset->getContent());
       
    58     }
       
    59 
       
    60     public function dump(FilterInterface $additionalFilter = null)
       
    61     {
       
    62         $cacheKey = self::getCacheKey($this->asset, $additionalFilter, 'dump');
       
    63         if ($this->cache->has($cacheKey)) {
       
    64             return $this->cache->get($cacheKey);
       
    65         }
       
    66 
       
    67         $content = $this->asset->dump($additionalFilter);
       
    68         $this->cache->set($cacheKey, $content);
       
    69 
       
    70         return $content;
       
    71     }
       
    72 
       
    73     public function getContent()
       
    74     {
       
    75         return $this->asset->getContent();
       
    76     }
       
    77 
       
    78     public function setContent($content)
       
    79     {
       
    80         $this->asset->setContent($content);
       
    81     }
       
    82 
       
    83     public function getSourceRoot()
       
    84     {
       
    85         return $this->asset->getSourceRoot();
       
    86     }
       
    87 
       
    88     public function getSourcePath()
       
    89     {
       
    90         return $this->asset->getSourcePath();
       
    91     }
       
    92 
       
    93     public function getTargetPath()
       
    94     {
       
    95         return $this->asset->getTargetPath();
       
    96     }
       
    97 
       
    98     public function setTargetPath($targetPath)
       
    99     {
       
   100         $this->asset->setTargetPath($targetPath);
       
   101     }
       
   102 
       
   103     public function getLastModified()
       
   104     {
       
   105         return $this->asset->getLastModified();
       
   106     }
       
   107 
       
   108     /**
       
   109      * Returns a cache key for the current asset.
       
   110      *
       
   111      * The key is composed of everything but an asset's content:
       
   112      *
       
   113      *  * source root
       
   114      *  * source path
       
   115      *  * target url
       
   116      *  * last modified
       
   117      *  * filters
       
   118      *
       
   119      * @param AssetInterface  $asset            The asset
       
   120      * @param FilterInterface $additionalFilter Any additional filter being applied
       
   121      * @param string          $salt             Salt for the key
       
   122      *
       
   123      * @return string A key for identifying the current asset
       
   124      */
       
   125     static private function getCacheKey(AssetInterface $asset, FilterInterface $additionalFilter = null, $salt = '')
       
   126     {
       
   127         if ($additionalFilter) {
       
   128             $asset = clone $asset;
       
   129             $asset->ensureFilter($additionalFilter);
       
   130         }
       
   131 
       
   132         $cacheKey  = $asset->getSourceRoot();
       
   133         $cacheKey .= $asset->getSourcePath();
       
   134         $cacheKey .= $asset->getTargetPath();
       
   135         $cacheKey .= $asset->getLastModified();
       
   136 
       
   137         foreach ($asset->getFilters() as $filter) {
       
   138             $cacheKey .= serialize($filter);
       
   139         }
       
   140 
       
   141         return md5($cacheKey.$salt);
       
   142     }
       
   143 }