diff --git a/core/lib/Drupal/Core/Template/TwigEnvironment.php b/core/lib/Drupal/Core/Template/TwigEnvironment.php index e10a1a913a593fc6884b988068f7550e7b5d3153..86f5dc6b7eabd67d92a43cb6aa7452ed8948be07 100644 --- a/core/lib/Drupal/Core/Template/TwigEnvironment.php +++ b/core/lib/Drupal/Core/Template/TwigEnvironment.php @@ -21,6 +21,13 @@ class TwigEnvironment extends \Twig_Environment { protected $cache_object = NULL; protected $storage = NULL; + /** + * Static cache of template classes. + * + * @var array + */ + protected $templateClasses; + /** * Constructs a TwigEnvironment object and stores cache and storage * internally. @@ -29,6 +36,8 @@ public function __construct(\Twig_LoaderInterface $loader = NULL, $options = arr // @todo Pass as arguments from the DIC. $this->cache_object = cache(); + $this->templateClasses = array(); + parent::__construct($loader, $options); } @@ -110,4 +119,19 @@ protected function storage() { return $this->storage; } + /** + * {@inheritdoc} + */ + 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] = parent::getTemplateClass($name, $index); + } + return $this->templateClasses[$cache_index]; + } + }