146 lines
3.9 KiB
PHP
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) ?: '';
|
|
}
|
|
}
|