namespace Drupal\Core\Template;
use Drupal\Core\Cache\CacheBackendInterface;
+use Drupal\Core\PhpStorage\PhpStorageFactory;
use Drupal\Core\Render\Markup;
use Drupal\Core\State\StateInterface;
*/
class TwigEnvironment extends \Twig_Environment {
+ /**
+ * Key name of the Twig cache prefix metadata key-value pair in State.
+ */
+ const CACHE_PREFIX_METADATA_KEY = 'twig_extension_hash_prefix';
+
+ /**
+ * The state service.
+ *
+ * @var \Drupal\Core\State\StateInterface
+ */
+ protected $state;
+
/**
* Static cache of template classes.
*
* The options for the Twig environment.
*/
public function __construct($root, CacheBackendInterface $cache, $twig_extension_hash, StateInterface $state, \Twig_LoaderInterface $loader = NULL, $options = []) {
+ $this->state = $state;
+
// 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->addExtension($sandbox);
if ($options['cache'] === TRUE) {
- $current = $state->get('twig_extension_hash_prefix', ['twig_extension_hash' => '']);
+ $current = $state->get(static::CACHE_PREFIX_METADATA_KEY, ['twig_extension_hash' => '']);
if ($current['twig_extension_hash'] !== $twig_extension_hash || empty($current['twig_cache_prefix'])) {
$current = [
'twig_extension_hash' => $twig_extension_hash,
'twig_cache_prefix' => uniqid(),
];
- $state->set('twig_extension_hash_prefix', $current);
+ $state->set(static::CACHE_PREFIX_METADATA_KEY, $current);
}
$this->twigCachePrefix = $current['twig_cache_prefix'];
parent::__construct($this->loader, $options);
}
+ /**
+ * Invalidates all compiled Twig templates.
+ *
+ * @see \drupal_flush_all_caches
+ */
+ public function invalidate() {
+ PhpStorageFactory::get('twig')->deleteAll();
+ $this->templateClasses = [];
+ $this->loadedTemplates = [];
+ $this->state->delete(static::CACHE_PREFIX_METADATA_KEY);
+ }
+
/**
* Get the cache prefixed used by \Drupal\Core\Template\TwigPhpStorageCache
*