src/Storefront/Framework/Twig/Extension/ConfigExtension.php line 43

  1. <?php declare(strict_types=1);
  2. namespace Shopware\Storefront\Framework\Twig\Extension;
  3. use Shopware\Core\Framework\Log\Package;
  4. use Shopware\Core\System\SalesChannel\SalesChannelContext;
  5. use Shopware\Core\System\SalesChannel\SalesChannelEntity;
  6. use Shopware\Storefront\Framework\Twig\TemplateConfigAccessor;
  7. use Twig\Extension\AbstractExtension;
  8. use Twig\TwigFunction;
  9. #[Package('storefront')]
  10. class ConfigExtension extends AbstractExtension
  11. {
  12.     /**
  13.      * @internal
  14.      */
  15.     public function __construct(private readonly TemplateConfigAccessor $config)
  16.     {
  17.     }
  18.     public function getFunctions(): array
  19.     {
  20.         return [
  21.             new TwigFunction('config'$this->config(...), ['needs_context' => true]),
  22.             new TwigFunction('theme_config'$this->theme(...), ['needs_context' => true]),
  23.         ];
  24.     }
  25.     /**
  26.      * @return string|bool|array|float|int|null
  27.      */
  28.     public function config(array $contextstring $key)
  29.     {
  30.         return $this->config->config($key$this->getSalesChannelId($context));
  31.     }
  32.     /**
  33.      * @return string|bool|array|float|int|null
  34.      */
  35.     public function theme(array $contextstring $key)
  36.     {
  37.         return $this->config->theme($key$this->getContext($context), $this->getThemeId($context));
  38.     }
  39.     private function getSalesChannelId(array $context): ?string
  40.     {
  41.         if (isset($context['context'])) {
  42.             $salesChannelContext $context['context'];
  43.             if ($salesChannelContext instanceof SalesChannelContext) {
  44.                 return $salesChannelContext->getSalesChannelId();
  45.             }
  46.         }
  47.         if (isset($context['salesChannel'])) {
  48.             $salesChannel $context['salesChannel'];
  49.             if ($salesChannel instanceof SalesChannelEntity) {
  50.                 return $salesChannel->getId();
  51.             }
  52.         }
  53.         return null;
  54.     }
  55.     private function getThemeId(array $context): ?string
  56.     {
  57.         return $context['themeId'] ?? null;
  58.     }
  59.     private function getContext(array $context): SalesChannelContext
  60.     {
  61.         if (!isset($context['context'])) {
  62.             throw new \RuntimeException('Missing sales channel context object');
  63.         }
  64.         $context $context['context'];
  65.         if (!$context instanceof SalesChannelContext) {
  66.             throw new \RuntimeException('Missing sales channel context object');
  67.         }
  68.         return $context;
  69.     }
  70. }