vendor/shopware/core/Framework/Context.php line 16

  1. <?php declare(strict_types=1);
  2. namespace Shopware\Core\Framework;
  3. use Shopware\Core\Checkout\Cart\Price\Struct\CartPrice;
  4. use Shopware\Core\Defaults;
  5. use Shopware\Core\Framework\Api\Context\AdminApiSource;
  6. use Shopware\Core\Framework\Api\Context\ContextSource;
  7. use Shopware\Core\Framework\Api\Context\SystemSource;
  8. use Shopware\Core\Framework\DataAbstractionLayer\Pricing\CashRoundingConfig;
  9. use Shopware\Core\Framework\Log\Package;
  10. use Shopware\Core\Framework\Struct\StateAwareTrait;
  11. use Shopware\Core\Framework\Struct\Struct;
  12. use Shopware\Core\System\SalesChannel\Exception\ContextRulesLockedException;
  13. use Symfony\Component\Serializer\Annotation\Ignore;
  14. #[Package('core')]
  15. class Context extends Struct
  16. {
  17.     use StateAwareTrait;
  18.     final public const SYSTEM_SCOPE 'system';
  19.     final public const USER_SCOPE 'user';
  20.     final public const CRUD_API_SCOPE 'crud';
  21.     final public const SKIP_TRIGGER_FLOW 'skipTriggerFlow';
  22.     /**
  23.      * @var non-empty-array<string>
  24.      */
  25.     protected array $languageIdChain;
  26.     protected string $scope self::USER_SCOPE;
  27.     protected bool $rulesLocked false;
  28.     #[Ignore]
  29.     protected $extensions = [];
  30.     /**
  31.      * @param array<string> $languageIdChain
  32.      * @param array<string> $ruleIds
  33.      */
  34.     public function __construct(
  35.         protected ContextSource $source,
  36.         protected array $ruleIds = [],
  37.         protected string $currencyId Defaults::CURRENCY,
  38.         array $languageIdChain = [Defaults::LANGUAGE_SYSTEM],
  39.         protected string $versionId Defaults::LIVE_VERSION,
  40.         protected float $currencyFactor 1.0,
  41.         protected bool $considerInheritance false,
  42.         /**
  43.          * @see CartPrice::TAX_STATE_GROSS, CartPrice::TAX_STATE_NET, CartPrice::TAX_STATE_FREE
  44.          */
  45.         protected string $taxState CartPrice::TAX_STATE_GROSS,
  46.         protected CashRoundingConfig $rounding = new CashRoundingConfig(20.01true)
  47.     ) {
  48.         if ($source instanceof SystemSource) {
  49.             $this->scope self::SYSTEM_SCOPE;
  50.         }
  51.         if (empty($languageIdChain)) {
  52.             throw new \InvalidArgumentException('Argument languageIdChain must not be empty');
  53.         }
  54.         /** @var non-empty-array<string> $chain */
  55.         $chain array_keys(array_flip(array_filter($languageIdChain)));
  56.         $this->languageIdChain $chain;
  57.     }
  58.     /**
  59.      * @internal
  60.      */
  61.     public static function createDefaultContext(?ContextSource $source null): self
  62.     {
  63.         $source ??= new SystemSource();
  64.         return new self($source);
  65.     }
  66.     public static function createCLIContext(?ContextSource $source null): self
  67.     {
  68.         return self::createDefaultContext($source);
  69.     }
  70.     public function getSource(): ContextSource
  71.     {
  72.         return $this->source;
  73.     }
  74.     public function getVersionId(): string
  75.     {
  76.         return $this->versionId;
  77.     }
  78.     public function getLanguageId(): string
  79.     {
  80.         return $this->languageIdChain[0];
  81.     }
  82.     public function getCurrencyId(): string
  83.     {
  84.         return $this->currencyId;
  85.     }
  86.     public function getCurrencyFactor(): float
  87.     {
  88.         return $this->currencyFactor;
  89.     }
  90.     /**
  91.      * @return array<string>
  92.      */
  93.     public function getRuleIds(): array
  94.     {
  95.         return $this->ruleIds;
  96.     }
  97.     /**
  98.      * @return non-empty-array<string>
  99.      */
  100.     public function getLanguageIdChain(): array
  101.     {
  102.         return $this->languageIdChain;
  103.     }
  104.     public function createWithVersionId(string $versionId): self
  105.     {
  106.         $context = new self(
  107.             $this->source,
  108.             $this->ruleIds,
  109.             $this->currencyId,
  110.             $this->languageIdChain,
  111.             $versionId,
  112.             $this->currencyFactor,
  113.             $this->considerInheritance,
  114.             $this->taxState,
  115.             $this->rounding
  116.         );
  117.         $context->scope $this->scope;
  118.         foreach ($this->getExtensions() as $key => $extension) {
  119.             $context->addExtension($key$extension);
  120.         }
  121.         return $context;
  122.     }
  123.     /**
  124.      * @template TReturn of mixed
  125.      *
  126.      * @param \Closure(Context): TReturn $callback
  127.      *
  128.      * @return TReturn the return value of the provided callback function
  129.      */
  130.     public function scope(string $scope\Closure $callback)
  131.     {
  132.         $currentScope $this->getScope();
  133.         $this->scope $scope;
  134.         try {
  135.             $result $callback($this);
  136.         } finally {
  137.             $this->scope $currentScope;
  138.         }
  139.         return $result;
  140.     }
  141.     public function getScope(): string
  142.     {
  143.         return $this->scope;
  144.     }
  145.     public function considerInheritance(): bool
  146.     {
  147.         return $this->considerInheritance;
  148.     }
  149.     public function setConsiderInheritance(bool $considerInheritance): void
  150.     {
  151.         $this->considerInheritance $considerInheritance;
  152.     }
  153.     public function getTaxState(): string
  154.     {
  155.         return $this->taxState;
  156.     }
  157.     public function setTaxState(string $taxState): void
  158.     {
  159.         $this->taxState $taxState;
  160.     }
  161.     public function isAllowed(string $privilege): bool
  162.     {
  163.         if ($this->source instanceof AdminApiSource) {
  164.             return $this->source->isAllowed($privilege);
  165.         }
  166.         return true;
  167.     }
  168.     /**
  169.      * @param array<string> $ruleIds
  170.      */
  171.     public function setRuleIds(array $ruleIds): void
  172.     {
  173.         if ($this->rulesLocked) {
  174.             throw new ContextRulesLockedException();
  175.         }
  176.         $this->ruleIds array_filter(array_values($ruleIds));
  177.     }
  178.     /**
  179.      * @template TReturn of mixed
  180.      *
  181.      * @param \Closure(Context): TReturn $function
  182.      *
  183.      * @return TReturn
  184.      */
  185.     public function enableInheritance(\Closure $function)
  186.     {
  187.         $previous $this->considerInheritance;
  188.         $this->considerInheritance true;
  189.         $result $function($this);
  190.         $this->considerInheritance $previous;
  191.         return $result;
  192.     }
  193.     /**
  194.      * @template TReturn of mixed
  195.      *
  196.      * @param \Closure(Context): TReturn $function
  197.      *
  198.      * @return TReturn
  199.      */
  200.     public function disableInheritance(\Closure $function)
  201.     {
  202.         $previous $this->considerInheritance;
  203.         $this->considerInheritance false;
  204.         $result $function($this);
  205.         $this->considerInheritance $previous;
  206.         return $result;
  207.     }
  208.     public function getApiAlias(): string
  209.     {
  210.         return 'context';
  211.     }
  212.     public function getRounding(): CashRoundingConfig
  213.     {
  214.         return $this->rounding;
  215.     }
  216.     public function setRounding(CashRoundingConfig $rounding): void
  217.     {
  218.         $this->rounding $rounding;
  219.     }
  220.     public function lockRules(): void
  221.     {
  222.         $this->rulesLocked true;
  223.     }
  224. }