vendor/symfony/src/Symfony/Component/Templating/Loader/CacheLoader.php
changeset 0 7f95f8617b0b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/symfony/src/Symfony/Component/Templating/Loader/CacheLoader.php	Sat Sep 24 15:40:41 2011 +0200
@@ -0,0 +1,95 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Templating\Loader;
+
+use Symfony\Component\Templating\Storage\Storage;
+use Symfony\Component\Templating\Storage\FileStorage;
+use Symfony\Component\Templating\TemplateReferenceInterface;
+
+/**
+ * CacheLoader is a loader that caches other loaders responses
+ * on the filesystem.
+ *
+ * This cache only caches on disk to allow PHP accelerators to cache the opcodes.
+ * All other mechanism would imply the use of `eval()`.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class CacheLoader extends Loader
+{
+    protected $loader;
+    protected $dir;
+
+    /**
+     * Constructor.
+     *
+     * @param LoaderInterface $loader A Loader instance
+     * @param string          $dir    The directory where to store the cache files
+     */
+    public function __construct(LoaderInterface $loader, $dir)
+    {
+        $this->loader = $loader;
+        $this->dir = $dir;
+    }
+
+    /**
+     * Loads a template.
+     *
+     * @param TemplateReferenceInterface $template A template
+     *
+     * @return Storage|Boolean false if the template cannot be loaded, a Storage instance otherwise
+     */
+    public function load(TemplateReferenceInterface $template)
+    {
+        $key = md5($template->getLogicalName());
+        $dir = $this->dir.DIRECTORY_SEPARATOR.substr($key, 0, 2);
+        $file = substr($key, 2).'.tpl';
+        $path = $dir.DIRECTORY_SEPARATOR.$file;
+
+        if (file_exists($path)) {
+            if (null !== $this->debugger) {
+                $this->debugger->log(sprintf('Fetching template "%s" from cache', $template->get('name')));
+            }
+
+            return new FileStorage($path);
+        }
+
+        if (false === $storage = $this->loader->load($template)) {
+            return false;
+        }
+
+        $content = $storage->getContent();
+
+        if (!file_exists($dir)) {
+            mkdir($dir, 0777, true);
+        }
+
+        file_put_contents($path, $content);
+
+        if (null !== $this->debugger) {
+            $this->debugger->log(sprintf('Storing template "%s" in cache', $template->get('name')));
+        }
+
+        return new FileStorage($path);
+    }
+
+    /**
+     * Returns true if the template is still fresh.
+     *
+     * @param TemplateReferenceInterface $template A template
+     * @param integer                    $time     The last modification time of the cached template (timestamp)
+     */
+    public function isFresh(TemplateReferenceInterface $template, $time)
+    {
+        return $this->loader->isFresh($template, $time);
+    }
+}