Files
2026-09-15 10:35:56 +08:00

146 lines
3.9 KiB
PHP

<?php
declare(strict_types=1);
namespace Esun3d\LanguageUrlStoreResolver\Observer;
use Magento\Framework\App\Http\Context as HttpContext;
use Magento\Framework\App\RequestInterface;
use Magento\Framework\Event\Observer;
use Magento\Framework\Event\ObserverInterface;
use Magento\Store\Model\StoreManagerInterface;
use Esun3d\LanguageUrlStoreResolver\Model\Config;
use Esun3d\LanguageUrlStoreResolver\Model\LanguageResolver;
use Esun3d\LanguageUrlStoreResolver\Model\MarketResolver;
use Esun3d\LanguageUrlStoreResolver\Model\StoreCodeMapper;
use Psr\Log\LoggerInterface;
class AddHttpContextObserver implements ObserverInterface
{
public const CONTEXT_MARKET = 'language_url_market';
public const CONTEXT_STORE_CODE = 'language_url_store_code';
/**
* @var Config
*/
private $config;
/**
* @var MarketResolver
*/
private $marketResolver;
/**
* @var HttpContext
*/
private $httpContext;
/**
* @var RequestInterface
*/
private $request;
/**
* @var StoreManagerInterface
*/
private $storeManager;
/**
* @var StoreCodeMapper
*/
private $storeCodeMapper;
/**
* @var LanguageResolver
*/
private $languageResolver;
/**
* @var LoggerInterface
*/
private $logger;
public function __construct(
Config $config,
LoggerInterface $logger,
MarketResolver $marketResolver,
HttpContext $httpContext,
RequestInterface $request,
StoreManagerInterface $storeManager,
StoreCodeMapper $storeCodeMapper,
LanguageResolver $languageResolver
) {
$this->config = $config;
$this->marketResolver = $marketResolver;
$this->httpContext = $httpContext;
$this->request = $request;
$this->storeManager = $storeManager;
$this->storeCodeMapper = $storeCodeMapper;
$this->languageResolver = $languageResolver;
$this->logger = $logger;
}
public function execute(Observer $observer): void
{
if (!$this->config->isEnabled()) {
$this->logger->debug('[LanguageUrlStoreResolver] config not Enabled');
return;
}
$market = $this->resolveMarket();
$storeCode = $this->resolveStoreCode();
$this->httpContext->setValue(
self::CONTEXT_MARKET,
$market,
$this->resolveDefaultStoreCode()
);
$this->httpContext->setValue(
self::CONTEXT_STORE_CODE,
$storeCode,
$this->resolveDefaultStoreCode()
);
}
private function resolveStoreCode(): string
{
try {
$storeCode = $this->storeManager->getStore()->getCode();
return $this->storeCodeMapper->isRealStoreCodeInScope($storeCode)
? $storeCode
: $this->resolveDefaultStoreCode();
} catch (\Throwable $exception) {
return $this->resolveDefaultStoreCode();
}
}
private function resolveMarket(): string
{
try {
$storeCode = $this->storeManager->getStore()->getCode();
$language = $this->storeCodeMapper->languageFromStoreCode($storeCode);
if ($language !== null) {
return $this->marketResolver->resolveForLanguage($this->request, $language) ?: '';
}
} catch (\Throwable $exception) {
return $this->resolveDefaultStoreCode();
}
return $this->marketResolver->resolve($this->request) ?: $this->resolveDefaultStoreCode();
}
private function resolveDefaultStoreCode(): string
{
$language = $this->request instanceof \Magento\Framework\App\Request\Http
? $this->languageResolver->resolveFromPath($this->request->getPathInfo())
: null;
if ($language === null) {
return '';
}
return $this->storeCodeMapper->getDefaultStoreCodeForLanguage($language) ?: '';
}
}