vendor/symfony/symfony/src/Symfony/Bundle/TwigBundle/CacheWarmer/TemplateCacheCacheWarmer.php line 14

Open in your IDE?
  1. <?php
  2. /*
  3.  * This file is part of the Symfony package.
  4.  *
  5.  * (c) Fabien Potencier <fabien@symfony.com>
  6.  *
  7.  * For the full copyright and license information, please view the LICENSE
  8.  * file that was distributed with this source code.
  9.  */
  10. namespace Symfony\Bundle\TwigBundle\CacheWarmer;
  11. @trigger_error('The '.TemplateCacheCacheWarmer::class.' class is deprecated since version 4.4 and will be removed in 5.0; use Twig instead.'E_USER_DEPRECATED);
  12. use Psr\Container\ContainerInterface;
  13. use Symfony\Bundle\FrameworkBundle\CacheWarmer\TemplateFinderInterface;
  14. use Symfony\Bundle\TwigBundle\DependencyInjection\CompatibilityServiceSubscriberInterface as ServiceSubscriberInterface;
  15. use Symfony\Component\Finder\Finder;
  16. use Symfony\Component\HttpKernel\CacheWarmer\CacheWarmerInterface;
  17. use Twig\Environment;
  18. use Twig\Error\Error;
  19. /**
  20.  * Generates the Twig cache for all templates.
  21.  *
  22.  * This warmer must be registered after TemplatePathsCacheWarmer,
  23.  * as the Twig loader will need the cache generated by it.
  24.  *
  25.  * @author Fabien Potencier <fabien@symfony.com>
  26.  *
  27.  * @deprecated since version 4.4, to be removed in 5.0; use Twig instead.
  28.  */
  29. class TemplateCacheCacheWarmer implements CacheWarmerInterfaceServiceSubscriberInterface
  30. {
  31.     protected $container;
  32.     protected $finder;
  33.     private $paths;
  34.     /**
  35.      * @param array $paths Additional twig paths to warm
  36.      */
  37.     public function __construct(ContainerInterface $containerTemplateFinderInterface $finder null, array $paths = [])
  38.     {
  39.         // We don't inject the Twig environment directly as it depends on the
  40.         // template locator (via the loader) which might be a cached one.
  41.         // The cached template locator is available once the TemplatePathsCacheWarmer
  42.         // has been warmed up.
  43.         // But it can also be null if templating has been disabled.
  44.         $this->container $container;
  45.         $this->finder $finder;
  46.         $this->paths $paths;
  47.     }
  48.     /**
  49.      * Warms up the cache.
  50.      *
  51.      * @param string $cacheDir The cache directory
  52.      */
  53.     public function warmUp($cacheDir)
  54.     {
  55.         if (null === $this->finder) {
  56.             return;
  57.         }
  58.         $twig $this->container->get('twig');
  59.         $templates $this->finder->findAllTemplates();
  60.         foreach ($this->paths as $path => $namespace) {
  61.             $templates array_merge($templates$this->findTemplatesInFolder($namespace$path));
  62.         }
  63.         foreach ($templates as $template) {
  64.             try {
  65.                 $twig->load($template);
  66.             } catch (Error $e) {
  67.                 // problem during compilation, give up
  68.             }
  69.         }
  70.     }
  71.     /**
  72.      * Checks whether this warmer is optional or not.
  73.      *
  74.      * @return bool always true
  75.      */
  76.     public function isOptional()
  77.     {
  78.         return true;
  79.     }
  80.     /**
  81.      * {@inheritdoc}
  82.      */
  83.     public static function getSubscribedServices()
  84.     {
  85.         return [
  86.             'twig' => Environment::class,
  87.         ];
  88.     }
  89.     /**
  90.      * Find templates in the given directory.
  91.      */
  92.     private function findTemplatesInFolder(?string $namespacestring $dir): array
  93.     {
  94.         if (!is_dir($dir)) {
  95.             return [];
  96.         }
  97.         $templates = [];
  98.         $finder = new Finder();
  99.         foreach ($finder->files()->followLinks()->in($dir) as $file) {
  100.             $name $file->getRelativePathname();
  101.             $templates[] = $namespace sprintf('@%s/%s'$namespace$name) : $name;
  102.         }
  103.         return $templates;
  104.     }
  105. }