cache = $cache; $this->templateCacheFilenamePrefix = $twig_cache_prefix; } /** * Gets the PHP code storage object to use for the compiled Twig files. * * @return \Drupal\Component\PhpStorage\PhpStorageInterface */ protected function storage() { if (!isset($this->storage)) { $this->storage = PhpStorageFactory::get('twig'); } return $this->storage; } /** * {@inheritdoc} */ public function generateKey(string $name, string $className): string { if (str_starts_with($name, '{# inline_template_start #}')) { // $name is an inline template, and can have characters that are not valid // for a filename. $suffix is unique for each inline template so we just // use the generic name 'inline-template' here. $name = 'inline-template'; } else { $name = basename($name); } // Windows (and some encrypted Linux systems) only support 255 characters in // a path. On Windows a requirements error is displayed and installation is // blocked if Drupal's public files path is longer than 120 characters. // Thus, to always be less than 255, file paths may not be more than 135 // characters long. Using the default PHP file storage class, the Twig cache // file path will be 124 characters long at most, which provides a margin of // safety. $suffix = substr($name, 0, self::SUFFIX_SUBSTRING_LENGTH) . '_'; $suffix .= substr(Crypt::hashBase64($className), 0, self::SUFFIX_SUBSTRING_LENGTH); // The cache prefix is what gets invalidated. return $this->templateCacheFilenamePrefix . '_' . $suffix; } /** * {@inheritdoc} */ public function load(string $key): void { $this->storage()->load($key); } /** * {@inheritdoc} */ public function write(string $key, string $content): void { $this->storage()->save($key, $content); // Save the last mtime. $cid = 'twig:' . $key; $this->cache->set($cid, \Drupal::time()->getRequestTime()); } /** * {@inheritdoc} */ public function getTimestamp(string $key): int { $cid = 'twig:' . $key; if ($cache = $this->cache->get($cid)) { return $cache->data; } else { return 0; } } }