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

118 lines
3.0 KiB
PHP

<?php
declare(strict_types=1);
namespace Esun3d\LanguageUrlStoreResolver\Plugin;
use Magento\Framework\App\Area;
use Magento\Framework\App\Request\Http as HttpRequest;
use Magento\Framework\App\RequestInterface;
use Magento\Framework\App\State;
use Magento\Framework\Url;
use Magento\Store\Model\StoreManagerInterface;
use Psr\Log\LoggerInterface;
use Esun3d\LanguageUrlStoreResolver\Model\Config;
use Esun3d\LanguageUrlStoreResolver\Model\StoreCodeMapper;
use Esun3d\LanguageUrlStoreResolver\Model\UrlPathConverter;
class UrlPlugin
{
/**
* @var Config
*/
private $config;
/**
* @var State
*/
private $appState;
/**
* @var StoreManagerInterface
*/
private $storeManager;
/**
* @var StoreCodeMapper
*/
private $storeCodeMapper;
/**
* @var UrlPathConverter
*/
private $urlPathConverter;
/**
* @var RequestInterface
*/
private $request;
/**
* @var LoggerInterface
*/
private $logger;
public function __construct(
Config $config,
State $appState,
StoreManagerInterface $storeManager,
StoreCodeMapper $storeCodeMapper,
UrlPathConverter $urlPathConverter,
RequestInterface $request,
LoggerInterface $logger
) {
$this->config = $config;
$this->appState = $appState;
$this->storeManager = $storeManager;
$this->storeCodeMapper = $storeCodeMapper;
$this->urlPathConverter = $urlPathConverter;
$this->request = $request;
$this->logger = $logger;
}
/**
* @param mixed|null $routePath
* @param mixed|null $routeParams
*/
public function afterGetUrl(Url $subject, string $result, $routePath = null, $routeParams = null): string
{
if (!$this->config->isEnabled() || !$this->isFrontendArea()) {
return $result;
}
$storeCode = null;
try {
$storeCode = $this->storeManager->getStore()->getCode();
$language = $this->storeCodeMapper->languageFromStoreCode($storeCode);
if ($language === null) {
return $result;
}
return $this->urlPathConverter->toLanguageUrl($result, $language);
} catch (\Throwable $exception) {
$this->logger->error(
'[LanguageUrlStoreResolver] Failed to convert generated URL.',
[
'path' => $this->request instanceof HttpRequest ? $this->request->getPathInfo() : null,
'request_uri' => $this->request instanceof HttpRequest ? $this->request->getRequestUri() : null,
'market' => null,
'store_code' => $storeCode,
'exception' => $exception,
]
);
}
return $result;
}
private function isFrontendArea(): bool
{
try {
return $this->appState->getAreaCode() === Area::AREA_FRONTEND;
} catch (\Throwable $exception) {
return false;
}
}
}