protected $paths;
protected $cache;
+ protected $errorCache;
/**
* Constructor.
public function addPath($path, $namespace = self::MAIN_NAMESPACE)
{
// invalidate the cache
- $this->cache = array();
+ $this->cache = $this->errorCache = array();
if (!is_dir($path)) {
throw new Twig_Error_Loader(sprintf('The "%s" directory does not exist.', $path));
public function prependPath($path, $namespace = self::MAIN_NAMESPACE)
{
// invalidate the cache
- $this->cache = array();
+ $this->cache = $this->errorCache = array();
if (!is_dir($path)) {
throw new Twig_Error_Loader(sprintf('The "%s" directory does not exist.', $path));
*/
public function exists($name)
{
- $name = (string) $name;
+ $name = $this->normalizeName($name);
+
if (isset($this->cache[$name])) {
return true;
}
- try {
- $this->findTemplate($name);
-
- return true;
- } catch (Twig_Error_Loader $exception) {
+ if (isset($this->errorCache[$name])) {
return false;
}
+
+ $this->doFindTemplate($name);
+
+ return isset($this->cache[$name]);
}
/**
protected function findTemplate($name)
{
- $name = (string) $name;
+ $name = $this->normalizeName($name);
+
+ if (isset($this->cache[$name])) {
+ return $this->cache[$name];
+ }
+
+ if (isset($this->errorCache[$name])) {
+ throw new Twig_Error_Loader($this->errorCache[$name]);
+ }
- // normalize name
- $name = preg_replace('#/{2,}#', '/', strtr($name, '\\', '/'));
+ $this->doFindTemplate($name);
if (isset($this->cache[$name])) {
return $this->cache[$name];
}
+ throw new Twig_Error_Loader($this->errorCache[$name]);
+ }
+
+ protected function doFindTemplate($name, $exists = false)
+ {
$this->validateName($name);
$namespace = self::MAIN_NAMESPACE;
$shortname = $name;
if (isset($name[0]) && '@' == $name[0]) {
if (false === $pos = strpos($name, '/')) {
- throw new Twig_Error_Loader(sprintf('Malformed namespaced template name "%s" (expecting "@namespace/template_name").', $name));
+ $this->errorCache[$name] = sprintf('Malformed namespaced template name "%s" (expecting "@namespace/template_name").', $name);
+
+ return;
}
$namespace = substr($name, 1, $pos - 1);
}
if (!isset($this->paths[$namespace])) {
- throw new Twig_Error_Loader(sprintf('There are no registered paths for namespace "%s".', $namespace));
+ $this->errorCache[$name] = sprintf('There are no registered paths for namespace "%s".', $namespace);
+
+ return;
}
foreach ($this->paths[$namespace] as $path) {
if (is_file($path.'/'.$shortname)) {
- return $this->cache[$name] = $path.'/'.$shortname;
+ $this->cache[$name] = $path.'/'.$shortname;
+
+ return;
}
}
- throw new Twig_Error_Loader(sprintf('Unable to find template "%s" (looked into: %s).', $name, implode(', ', $this->paths[$namespace])));
+ $this->errorCache[$name] = sprintf('Unable to find template "%s" (looked into: %s).', $name, implode(', ', $this->paths[$namespace]));
+ }
+
+ protected function normalizeName($name)
+ {
+ return preg_replace('#/{2,}#', '/', strtr((string) $name, '\\', '/'));
}
protected function validateName($name)