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

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