vendor/shopware/core/Framework/Adapter/Twig/EntityTemplateLoader.php line 31

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace Shopware\Core\Framework\Adapter\Twig;
  3. use Doctrine\DBAL\Connection;
  4. use Shopware\Core\Framework\DependencyInjection\CompilerPass\TwigLoaderConfigCompilerPass;
  5. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  6. use Twig\Error\LoaderError;
  7. use Twig\Loader\LoaderInterface;
  8. use Twig\Source;
  9. class EntityTemplateLoader implements LoaderInterfaceEventSubscriberInterface
  10. {
  11.     private array $databaseTemplateCache = [];
  12.     private Connection $connection;
  13.     private string $environment;
  14.     public function __construct(Connection $connectionstring $environment)
  15.     {
  16.         $this->connection $connection;
  17.         $this->environment $environment;
  18.     }
  19.     public static function getSubscribedEvents(): array
  20.     {
  21.         return ['app_template.written' => 'clearInternalCache'];
  22.     }
  23.     public function clearInternalCache(): void
  24.     {
  25.         $this->databaseTemplateCache = [];
  26.     }
  27.     public function getSourceContext(string $name): Source
  28.     {
  29.         $template $this->findDatabaseTemplate($name);
  30.         if (!$template) {
  31.             throw new LoaderError(sprintf('Template "%s" is not defined.'$name));
  32.         }
  33.         return new Source($template['template'], $name);
  34.     }
  35.     public function getCacheKey(string $name): string
  36.     {
  37.         return $name;
  38.     }
  39.     public function isFresh(string $nameint $time): bool
  40.     {
  41.         $template $this->findDatabaseTemplate($name);
  42.         if (!$template) {
  43.             return false;
  44.         }
  45.         return $template['updatedAt'] === null || $template['updatedAt']->getTimestamp() < $time;
  46.     }
  47.     /**
  48.      * @return bool
  49.      */
  50.     public function exists(string $name)
  51.     {
  52.         $template $this->findDatabaseTemplate($name);
  53.         if (!$template) {
  54.             return false;
  55.         }
  56.         return true;
  57.     }
  58.     private function findDatabaseTemplate(string $name): ?array
  59.     {
  60.         /*
  61.          * In dev env app templates are directly loaded over the filesystem
  62.          * @see TwigLoaderConfigCompilerPass::addAppTemplatePaths()
  63.          */
  64.         if ($this->environment === 'dev') {
  65.             return null;
  66.         }
  67.         $templateName $this->splitTemplateName($name);
  68.         $namespace $templateName['namespace'];
  69.         $path $templateName['path'];
  70.         if (empty($this->databaseTemplateCache)) {
  71.             $templates $this->connection->fetchAll('
  72.                 SELECT
  73.                     `app_template`.`path` AS `path`,
  74.                     `app_template`.`template` AS `template`,
  75.                     `app_template`.`updated_at` AS `updatedAt`,
  76.                     `app`.`name` AS `namespace`
  77.                 FROM `app_template`
  78.                 INNER JOIN `app` ON `app_template`.`app_id` = `app`.`id`
  79.                 WHERE `app_template`.`active` = 1 AND `app`.`active` = 1
  80.             ');
  81.             /** @var array $template */
  82.             foreach ($templates as $template) {
  83.                 $this->databaseTemplateCache[$template['path']][$template['namespace']] = [
  84.                     'template' => $template['template'],
  85.                     'updatedAt' => $template['updatedAt'] ? new \DateTimeImmutable($template['updatedAt']) : null,
  86.                 ];
  87.             }
  88.         }
  89.         if (\array_key_exists($path$this->databaseTemplateCache) && \array_key_exists($namespace$this->databaseTemplateCache[$path])) {
  90.             return $this->databaseTemplateCache[$path][$namespace];
  91.         }
  92.         // we have already loaded all DB templates
  93.         // if the namespace is not included return null
  94.         return $this->databaseTemplateCache[$path][$namespace] = null;
  95.     }
  96.     private function splitTemplateName(string $template): array
  97.     {
  98.         // remove static template inheritance prefix
  99.         if (mb_strpos($template'@') !== 0) {
  100.             return ['path' => $template'namespace' => ''];
  101.         }
  102.         // remove "@"
  103.         $template mb_substr($template1);
  104.         $template explode('/'$template);
  105.         $namespace array_shift($template);
  106.         $template implode('/'$template);
  107.         return ['path' => $template'namespace' => $namespace];
  108.     }
  109. }