Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
Total | |
100.00% |
1 / 1 |
|
100.00% |
0 / 0 |
CRAP | |
100.00% |
0 / 0 |
TwigEnvironment | |
100.00% |
1 / 1 |
|
100.00% |
3 / 3 |
7 | |
100.00% |
0 / 0 |
__construct | |
100.00% |
1 / 1 |
2 | |
100.00% |
0 / 0 |
|||
getTemplateClass | |
100.00% |
1 / 1 |
4 | |
100.00% |
0 / 0 |
|||
renderInline | |
100.00% |
1 / 1 |
1 | |
100.00% |
0 / 0 |
<?php | |
/** | |
* @file | |
* Contains \Drupal\Core\Template\TwigEnvironment. | |
*/ | |
namespace Drupal\Core\Template; | |
use Drupal\Core\Cache\CacheBackendInterface; | |
use Drupal\Core\Render\Markup; | |
/** | |
* A class that defines a Twig environment for Drupal. | |
* | |
* Instances of this class are used to store the configuration and extensions, | |
* and are used to load templates from the file system or other locations. | |
* | |
* @see core\vendor\twig\twig\lib\Twig\Environment.php | |
*/ | |
class TwigEnvironment extends \Twig_Environment { | |
/** | |
* Static cache of template classes. | |
* | |
* @var array | |
*/ | |
protected $templateClasses; | |
/** | |
* Constructs a TwigEnvironment object and stores cache and storage | |
* internally. | |
* | |
* @param string $root | |
* The app root. | |
* @param \Drupal\Core\Cache\CacheBackendInterface $cache | |
* The cache bin. | |
* @param string $twig_extension_hash | |
* The Twig extension hash. | |
* @param \Twig_LoaderInterface $loader | |
* The Twig loader or loader chain. | |
* @param array $options | |
* The options for the Twig environment. | |
*/ | |
public function __construct($root, CacheBackendInterface $cache, $twig_extension_hash, \Twig_LoaderInterface $loader = NULL, $options = array()) { | |
// Ensure that twig.engine is loaded, given that it is needed to render a | |
// template because functions like TwigExtension::escapeFilter() are called. | |
require_once $root . '/core/themes/engines/twig/twig.engine'; | |
$this->templateClasses = array(); | |
$options += array( | |
// @todo Ensure garbage collection of expired files. | |
'cache' => TRUE, | |
'debug' => FALSE, | |
'auto_reload' => NULL, | |
); | |
// Ensure autoescaping is always on. | |
$options['autoescape'] = 'html'; | |
$policy = new TwigSandboxPolicy(); | |
$sandbox = new \Twig_Extension_Sandbox($policy, TRUE); | |
$this->addExtension($sandbox); | |
if ($options['cache'] === TRUE) { | |
$options['cache'] = new TwigPhpStorageCache($cache, $twig_extension_hash); | |
} | |
$this->loader = $loader; | |
parent::__construct($this->loader, $options); | |
} | |
/** | |
* Gets the template class associated with the given string. | |
* | |
* @param string $name | |
* The name for which to calculate the template class name. | |
* @param int $index | |
* The index if it is an embedded template. | |
* | |
* @return string | |
* The template class name. | |
*/ | |
public function getTemplateClass($name, $index = NULL) { | |
// We override this method to add caching because it gets called multiple | |
// times when the same template is used more than once. For example, a page | |
// rendering 50 nodes without any node template overrides will use the same | |
// node.html.twig for the output of each node and the same compiled class. | |
$cache_index = $name . (NULL === $index ? '' : '_' . $index); | |
if (!isset($this->templateClasses[$cache_index])) { | |
$this->templateClasses[$cache_index] = $this->templateClassPrefix . hash('sha256', $this->loader->getCacheKey($name)) . (NULL === $index ? '' : '_' . $index); | |
} | |
return $this->templateClasses[$cache_index]; | |
} | |
/** | |
* Renders a twig string directly. | |
* | |
* Warning: You should use the render element 'inline_template' together with | |
* the #template attribute instead of this method directly. | |
* On top of that you have to ensure that the template string is not dynamic | |
* but just an ordinary static php string, because there may be installations | |
* using read-only PHPStorage that want to generate all possible twig | |
* templates as part of a build step. So it is important that an automated | |
* script can find the templates and extract them. This is only possible if | |
* the template is a regular string. | |
* | |
* @param string $template_string | |
* The template string to render with placeholders. | |
* @param array $context | |
* An array of parameters to pass to the template. | |
* | |
* @return \Drupal\Component\Render\MarkupInterface|string | |
* The rendered inline template as a Markup object. | |
* | |
* @see \Drupal\Core\Template\Loader\StringLoader::exists() | |
*/ | |
public function renderInline($template_string, array $context = array()) { | |
// Prefix all inline templates with a special comment. | |
$template_string = '{# inline_template_start #}' . $template_string; | |
return Markup::create($this->loadTemplate($template_string, NULL)->render($context)); | |
} | |
} |