diff --git a/src/SingletonProvider/TwigEnvironmentProvider.php b/src/SingletonProvider/TwigEnvironmentProvider.php index 359d265369edcddc5151a9233bba0bca6befc146..848fa197be75ab33ba47c9967058741ca7abc8ff 100644 --- a/src/SingletonProvider/TwigEnvironmentProvider.php +++ b/src/SingletonProvider/TwigEnvironmentProvider.php @@ -15,9 +15,12 @@ use Distantmagic\Resonance\SingletonCollection; use Distantmagic\Resonance\SingletonContainer; use Distantmagic\Resonance\SingletonProvider; use Distantmagic\Resonance\TwigChainLoader; +use Psr\Log\LoggerInterface; use Symfony\Component\Filesystem\Filesystem; +use Symfony\Component\Finder\Finder; use Twig\Cache\FilesystemCache; use Twig\Environment as TwigEnvironment; +use Twig\Error\Error; use Twig\Extension\ExtensionInterface; /** @@ -29,6 +32,7 @@ final readonly class TwigEnvironmentProvider extends SingletonProvider { public function __construct( private ApplicationConfiguration $applicationConfiguration, + private LoggerInterface $logger, private TwigChainLoader $twigChainLoader, ) {} @@ -43,6 +47,8 @@ final readonly class TwigEnvironmentProvider extends SingletonProvider $twigEnvironment->addExtension($twigExtensionAttribute->singleton); } + $this->warmupCache($twigEnvironment); + return $twigEnvironment; } @@ -71,4 +77,37 @@ final readonly class TwigEnvironmentProvider extends SingletonProvider return new FilesystemCache($cacheDirectory, FilesystemCache::FORCE_BYTECODE_INVALIDATION); } + + private function warmupCache(TwigEnvironment $twigEnvironment): void + { + $viewsDirectory = DM_APP_ROOT.'/views'; + + if (!is_dir($viewsDirectory)) { + return; + } + + $finder = new Finder(); + $found = $finder + ->files() + ->ignoreDotFiles(true) + ->ignoreUnreadableDirs() + ->ignoreVCS(true) + ->in($viewsDirectory) + ; + + foreach ($found as $file) { + $relativePathname = $file->getRelativePathname(); + + try { + $twigEnvironment->load($relativePathname); + } catch (Error $error) { + $this->logger->warning(sprintf( + 'twig_cache_warmup_error("%s", %d): %s', + $relativePathname, + $error->getTemplateLine(), + $error->getMessage() + )); + } + } + } }