custom/plugins/SwagB2bPlatform/components/Shop/BridgePlatform/ContextProvider.php line 54

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace Shopware\B2B\Shop\BridgePlatform;
  3. use Shopware\Core\Defaults;
  4. use Shopware\Core\Framework\Api\Context\AdminApiSource;
  5. use Shopware\Core\Framework\Context;
  6. use Shopware\Core\Framework\Routing\Event\SalesChannelContextResolvedEvent;
  7. use Shopware\Core\Framework\Uuid\Uuid;
  8. use Shopware\Core\PlatformRequest;
  9. use Shopware\Core\System\SalesChannel\Context\SalesChannelContextServiceInterface;
  10. use Shopware\Core\System\SalesChannel\Context\SalesChannelContextServiceParameters;
  11. use Shopware\Core\System\SalesChannel\SalesChannelContext;
  12. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  13. use Symfony\Component\HttpFoundation\RequestStack;
  14. class ContextProvider implements EventSubscriberInterface
  15. {
  16.     /**
  17.      * @var SalesChannelContext|null
  18.      */
  19.     private $salesChannelContext;
  20.     /**
  21.      * @var Context|null
  22.      */
  23.     private $context;
  24.     /**
  25.      * @var RequestStack
  26.      */
  27.     private $requestStack;
  28.     /**
  29.      * @var SalesChannelContextServiceInterface
  30.      */
  31.     private $salesChannelContextService;
  32.     public function __construct(
  33.         RequestStack $requestStack,
  34.         SalesChannelContextServiceInterface $salesChannelContextService
  35.     ) {
  36.         $this->requestStack $requestStack;
  37.         $this->salesChannelContextService $salesChannelContextService;
  38.     }
  39.     public static function getSubscribedEvents(): array
  40.     {
  41.         return [
  42.             SalesChannelContextResolvedEvent::class => 'onSalesChannelContextResolved',
  43.         ];
  44.     }
  45.     public function getSalesChannelContext(): SalesChannelContext
  46.     {
  47.         if ($this->salesChannelContext) {
  48.             return $this->salesChannelContext;
  49.         }
  50.         $this->salesChannelContext $this->loadSalesChannelContextFromRequest();
  51.         if (!$this->salesChannelContext) {
  52.             $this->salesChannelContext $this->loadDefaultSalesChannelContext();
  53.         }
  54.         return $this->salesChannelContext;
  55.     }
  56.     public function setSalesChannelContext(SalesChannelContext $salesChannelContext): void
  57.     {
  58.         $this->salesChannelContext $salesChannelContext;
  59.     }
  60.     public function hasSalesChannelContext(): bool
  61.     {
  62.         return $this->salesChannelContext instanceof SalesChannelContext;
  63.     }
  64.     public function getContext(): Context
  65.     {
  66.         if ($this->context) {
  67.             return $this->context;
  68.         }
  69.         $this->context $this->loadContextFromRequest();
  70.         if ($this->context) {
  71.             return $this->context;
  72.         }
  73.         return $this->getSalesChannelContext()->getContext();
  74.     }
  75.     public function isAdminApiSource(): bool
  76.     {
  77.         return $this->getContext()->getSource() instanceof AdminApiSource;
  78.     }
  79.     public function setContext(Context $context): void
  80.     {
  81.         $this->context $context;
  82.     }
  83.     /**
  84.      * @internal
  85.      */
  86.     protected function loadSalesChannelContextFromRequest(): ?SalesChannelContext
  87.     {
  88.         $masterRequest $this->requestStack->getMasterRequest();
  89.         if (!$masterRequest) {
  90.             return null;
  91.         }
  92.         return $masterRequest
  93.             ->attributes
  94.             ->get(PlatformRequest::ATTRIBUTE_SALES_CHANNEL_CONTEXT_OBJECT);
  95.     }
  96.     /**
  97.      * @internal
  98.      */
  99.     protected function loadContextFromRequest(): ?Context
  100.     {
  101.         $masterRequest $this->requestStack->getMasterRequest();
  102.         if (!$masterRequest) {
  103.             return null;
  104.         }
  105.         return $masterRequest
  106.             ->attributes
  107.             ->get(PlatformRequest::ATTRIBUTE_CONTEXT_OBJECT);
  108.     }
  109.     public function onSalesChannelContextResolved(SalesChannelContextResolvedEvent $event): void
  110.     {
  111.         $this->salesChannelContext $event->getSalesChannelContext();
  112.     }
  113.     /**
  114.      * @internal
  115.      */
  116.     protected function loadDefaultSalesChannelContext(): SalesChannelContext
  117.     {
  118.         return $this
  119.             ->salesChannelContextService
  120.             ->get(new SalesChannelContextServiceParameters(
  121.                 Defaults::SALES_CHANNEL,
  122.                 Uuid::randomHex(),
  123.                 Defaults::LANGUAGE_SYSTEM
  124.             ));
  125.     }
  126. }