added Twig_Loader_Chain
authorFabien Potencier <fabien.potencier@gmail.com>
Wed, 24 Aug 2011 10:56:57 +0000 (12:56 +0200)
committerFabien Potencier <fabien.potencier@gmail.com>
Wed, 24 Aug 2011 10:56:57 +0000 (12:56 +0200)
CHANGELOG
lib/Twig/Loader/Chain.php [new file with mode: 0644]
test/Twig/Tests/Loader/ChainTest.php [new file with mode: 0644]

index 72b120f..f8f26f8 100644 (file)
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,5 +1,6 @@
 * 1.2.0
 
+ * added Twig_Loader_Chain
  * added Twig_Loader_Array::setTemplate()
  * added an optimization for the set tag when used to capture a large chunk of static text
  * changed name regex to match PHP one "[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*" (works for blocks, tags, functions, filters, and macros)
diff --git a/lib/Twig/Loader/Chain.php b/lib/Twig/Loader/Chain.php
new file mode 100644 (file)
index 0000000..48dd8b8
--- /dev/null
@@ -0,0 +1,100 @@
+<?php
+
+/*
+ * This file is part of Twig.
+ *
+ * (c) 2011 Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * Loads templates from other loaders.
+ *
+ * @package twig
+ * @author  Fabien Potencier <fabien@symfony.com>
+ */
+class Twig_Loader_Chain implements Twig_LoaderInterface
+{
+    protected $loaders;
+
+    /**
+     * Constructor.
+     *
+     * @param Twig_LoaderInterface[] $loaders An array of loader instances
+     */
+    public function __construct(array $loaders = array())
+    {
+        $this->loaders = array();
+        foreach ($loaders as $loader) {
+            $this->addLoader($loader);
+        }
+    }
+
+    /**
+     * Adds a loader instance.
+     *
+     * @param Twig_LoaderInterface $loader A Loader instance
+     */
+    public function addLoader(Twig_LoaderInterface $loader)
+    {
+        $this->loaders[] = $loader;
+    }
+
+    /**
+     * Gets the source code of a template, given its name.
+     *
+     * @param  string $name The name of the template to load
+     *
+     * @return string The template source code
+     */
+    public function getSource($name)
+    {
+        foreach ($this->loaders as $loader) {
+            try {
+                return $loader->getSource($name);
+            } catch (Twig_Error_Loader $e) {
+            }
+        }
+
+        throw new Twig_Error_Loader(sprintf('Template "%s" is not defined.', $name));
+    }
+
+    /**
+     * Gets the cache key to use for the cache for a given template name.
+     *
+     * @param  string $name The name of the template to load
+     *
+     * @return string The cache key
+     */
+    public function getCacheKey($name)
+    {
+        foreach ($this->loaders as $loader) {
+            try {
+                return $loader->getCacheKey($name);
+            } catch (Twig_Error_Loader $e) {
+            }
+        }
+
+        throw new Twig_Error_Loader(sprintf('Template "%s" is not defined.', $name));
+    }
+
+    /**
+     * Returns true if the template is still fresh.
+     *
+     * @param string    $name The template name
+     * @param timestamp $time The last modification time of the cached template
+     */
+    public function isFresh($name, $time)
+    {
+        foreach ($this->loaders as $loader) {
+            try {
+                return $loader->isFresh($name, $time);
+            } catch (Twig_Error_Loader $e) {
+            }
+        }
+
+        throw new Twig_Error_Loader(sprintf('Template "%s" is not defined.', $name));
+    }
+}
diff --git a/test/Twig/Tests/Loader/ChainTest.php b/test/Twig/Tests/Loader/ChainTest.php
new file mode 100644 (file)
index 0000000..580ae10
--- /dev/null
@@ -0,0 +1,63 @@
+<?php
+
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+class Twig_Tests_Loader_ChainTest extends PHPUnit_Framework_TestCase
+{
+    public function testGetSource()
+    {
+        $loader = new Twig_Loader_Chain(array(
+            new Twig_Loader_Array(array('foo' => 'bar')),
+            new Twig_Loader_Array(array('foo' => 'foobar', 'bar' => 'foo')),
+        ));
+
+        $this->assertEquals('bar', $loader->getSource('foo'));
+        $this->assertEquals('foo', $loader->getSource('bar'));
+    }
+
+    /**
+     * @expectedException Twig_Error_Loader
+     */
+    public function testGetSourceWhenTemplateDoesNotExist()
+    {
+        $loader = new Twig_Loader_Chain(array());
+
+        $loader->getSource('foo');
+    }
+
+    public function testGetCacheKey()
+    {
+        $loader = new Twig_Loader_Chain(array(
+            new Twig_Loader_Array(array('foo' => 'bar')),
+            new Twig_Loader_Array(array('foo' => 'foobar', 'bar' => 'foo')),
+        ));
+
+        $this->assertEquals('bar', $loader->getCacheKey('foo'));
+        $this->assertEquals('foo', $loader->getCacheKey('bar'));
+    }
+
+    /**
+     * @expectedException Twig_Error_Loader
+     */
+    public function testGetCacheKeyWhenTemplateDoesNotExist()
+    {
+        $loader = new Twig_Loader_Chain(array());
+
+        $loader->getCacheKey('foo');
+    }
+
+    public function testAddLoader()
+    {
+        $loader = new Twig_Loader_Chain();
+        $loader->addLoader(new Twig_Loader_Array(array('foo' => 'bar')));
+
+        $this->assertEquals('bar', $loader->getSource('foo'));
+    }
+}