vendor/shopware/core/Framework/Routing/SalesChannelRequestContextResolver.php line 64
<?php declare(strict_types=1);namespace Shopware\Core\Framework\Routing;use Shopware\Core\Checkout\Cart\CartException;use Shopware\Core\Framework\Log\Package;use Shopware\Core\Framework\Routing\Event\SalesChannelContextResolvedEvent;use Shopware\Core\Framework\Routing\Exception\MissingRequestParameterException;use Shopware\Core\Framework\Util\Random;use Shopware\Core\PlatformRequest;use Shopware\Core\SalesChannelRequest;use Shopware\Core\System\SalesChannel\Context\SalesChannelContextServiceInterface;use Shopware\Core\System\SalesChannel\Context\SalesChannelContextServiceParameters;use Shopware\Core\System\SalesChannel\SalesChannelContext;use Symfony\Component\EventDispatcher\EventDispatcherInterface;use Symfony\Component\HttpFoundation\Request;use Symfony\Component\HttpFoundation\Request as SymfonyRequest;#[Package('core')]class SalesChannelRequestContextResolver implements RequestContextResolverInterface{use RouteScopeCheckTrait;/*** @internal*/public function __construct(private readonly RequestContextResolverInterface $decorated,private readonly SalesChannelContextServiceInterface $contextService,private readonly EventDispatcherInterface $eventDispatcher,private readonly RouteScopeRegistry $routeScopeRegistry) {}public function resolve(SymfonyRequest $request): void{if (!$request->attributes->has(PlatformRequest::ATTRIBUTE_SALES_CHANNEL_ID)) {$this->decorated->resolve($request);return;}if (!$this->isRequestScoped($request, SalesChannelContextRouteScopeDependant::class)) {return;}if (!$request->headers->has(PlatformRequest::HEADER_CONTEXT_TOKEN)) {if ($this->contextTokenRequired($request)) {throw new MissingRequestParameterException(PlatformRequest::HEADER_CONTEXT_TOKEN);}$request->headers->set(PlatformRequest::HEADER_CONTEXT_TOKEN, Random::getAlphanumericString(32));}// Retrieve context for current request$usedContextToken = (string) $request->headers->get(PlatformRequest::HEADER_CONTEXT_TOKEN);$contextServiceParameters = new SalesChannelContextServiceParameters((string) $request->attributes->get(PlatformRequest::ATTRIBUTE_SALES_CHANNEL_ID),$usedContextToken,$request->headers->get(PlatformRequest::HEADER_LANGUAGE_ID),$request->attributes->get(SalesChannelRequest::ATTRIBUTE_DOMAIN_CURRENCY_ID),$request->attributes->get(SalesChannelRequest::ATTRIBUTE_DOMAIN_ID));$context = $this->contextService->get($contextServiceParameters);// Validate if a customer login is required for the current request$this->validateLogin($request, $context);// Update attributes and headers of the current request$request->attributes->set(PlatformRequest::ATTRIBUTE_CONTEXT_OBJECT, $context->getContext());$request->attributes->set(PlatformRequest::ATTRIBUTE_SALES_CHANNEL_CONTEXT_OBJECT, $context);$request->headers->set(PlatformRequest::HEADER_CONTEXT_TOKEN, $context->getToken());$this->eventDispatcher->dispatch(new SalesChannelContextResolvedEvent($context, $usedContextToken));}public function handleSalesChannelContext(Request $request, string $salesChannelId, string $contextToken): void{$language = $request->headers->get(PlatformRequest::HEADER_LANGUAGE_ID);$currencyId = $request->attributes->get(SalesChannelRequest::ATTRIBUTE_DOMAIN_CURRENCY_ID);$context = $this->contextService->get(new SalesChannelContextServiceParameters($salesChannelId, $contextToken, $language, $currencyId));$request->attributes->set(PlatformRequest::ATTRIBUTE_CONTEXT_OBJECT, $context->getContext());$request->attributes->set(PlatformRequest::ATTRIBUTE_SALES_CHANNEL_CONTEXT_OBJECT, $context);}protected function getScopeRegistry(): RouteScopeRegistry{return $this->routeScopeRegistry;}private function contextTokenRequired(Request $request): bool{return (bool) $request->attributes->get(PlatformRequest::ATTRIBUTE_CONTEXT_TOKEN_REQUIRED, false);}private function validateLogin(Request $request, SalesChannelContext $context): void{if (!$request->attributes->get(PlatformRequest::ATTRIBUTE_LOGIN_REQUIRED)) {return;}if ($context->getCustomer() === null) {throw CartException::customerNotLoggedIn();}if ($request->attributes->get(PlatformRequest::ATTRIBUTE_LOGIN_REQUIRED_ALLOW_GUEST, false) === false && $context->getCustomer()->getGuest()) {throw CartException::customerNotLoggedIn();}}}