vendor/shopware/core/Framework/Adapter/Twig/NamespaceHierarchy/BundleHierarchyBuilder.php line 64

  1. <?php declare(strict_types=1);
  2. namespace Shopware\Core\Framework\Adapter\Twig\NamespaceHierarchy;
  3. use Doctrine\DBAL\Connection;
  4. use Shopware\Core\Framework\Bundle;
  5. use Shopware\Core\Framework\Log\Package;
  6. use Symfony\Component\HttpKernel\KernelInterface;
  7. #[Package('core')]
  8. class BundleHierarchyBuilder implements TemplateNamespaceHierarchyBuilderInterface
  9. {
  10.     /**
  11.      * @internal
  12.      */
  13.     public function __construct(
  14.         private readonly KernelInterface $kernel,
  15.         private readonly Connection $connection
  16.     ) {
  17.     }
  18.     public function buildNamespaceHierarchy(array $namespaceHierarchy): array
  19.     {
  20.         $bundles = [];
  21.         foreach ($this->kernel->getBundles() as $bundle) {
  22.             if (!$bundle instanceof Bundle) {
  23.                 continue;
  24.             }
  25.             $bundlePath $bundle->getPath();
  26.             $directory $bundlePath '/Resources/views';
  27.             if (!file_exists($directory)) {
  28.                 continue;
  29.             }
  30.             $bundles[$bundle->getName()] = $bundle->getTemplatePriority();
  31.         }
  32.         $bundles array_reverse($bundles);
  33.         $apps $this->getAppTemplateNamespaces();
  34.         /** @var array $combinedApps */
  35.         $combinedApps array_combine(array_keys($apps), array_column($apps'template_load_priority'));
  36.         $extensions array_merge($combinedApps$bundles);
  37.         asort($extensions);
  38.         foreach ($apps as $appName => ['version' => $version]) {
  39.             $extensions[$appName] = $version;
  40.         }
  41.         return array_merge(
  42.             $extensions,
  43.             $namespaceHierarchy
  44.         );
  45.     }
  46.     private function getAppTemplateNamespaces(): array
  47.     {
  48.         return $this->connection->fetchAllAssociativeIndexed(
  49.             'SELECT `app`.`name`, `app`.`version`, `app`.`template_load_priority`
  50.              FROM `app`
  51.              INNER JOIN `app_template` ON `app_template`.`app_id` = `app`.`id`
  52.              WHERE `app`.`active` = 1 AND `app_template`.`active` = 1'
  53.         );
  54.     }
  55. }