118 lines
3.0 KiB
PHP
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;
|
|
}
|
|
}
|
|
}
|