Files
esun3d/app/code/Esun3d/LanguageUrlStoreResolver/Observer/RewritePageLinksObserver.php
T
2026-09-15 10:35:56 +08:00

101 lines
2.7 KiB
PHP

<?php
declare(strict_types=1);
namespace Esun3d\LanguageUrlStoreResolver\Observer;
use Esun3d\LanguageUrlStoreResolver\Model\Config;
use Esun3d\LanguageUrlStoreResolver\Model\HtmlLinkProcessor;
use Esun3d\LanguageUrlStoreResolver\Model\StoreCodeMapper;
use Magento\Framework\App\Response\Http as HttpResponse;
use Magento\Framework\Event\Observer;
use Magento\Framework\Event\ObserverInterface;
use Magento\Store\Model\StoreManagerInterface;
use Psr\Log\LoggerInterface;
class RewritePageLinksObserver implements ObserverInterface
{
/**
* @var Config
*/
private $config;
/**
* @var HtmlLinkProcessor
*/
private $htmlLinkProcessor;
/**
* @var StoreManagerInterface
*/
private $storeManager;
/**
* @var StoreCodeMapper
*/
private $storeCodeMapper;
/**
* @var LoggerInterface
*/
private $logger;
/**
* @param Config $config
* @param HtmlLinkProcessor $htmlLinkProcessor
* @param StoreManagerInterface $storeManager
* @param StoreCodeMapper $storeCodeMapper
* @param LoggerInterface $logger
*/
public function __construct(
Config $config,
HtmlLinkProcessor $htmlLinkProcessor,
StoreManagerInterface $storeManager,
StoreCodeMapper $storeCodeMapper,
LoggerInterface $logger
) {
$this->config = $config;
$this->htmlLinkProcessor = $htmlLinkProcessor;
$this->storeManager = $storeManager;
$this->storeCodeMapper = $storeCodeMapper;
$this->logger = $logger;
}
/**
* Rewrite internal links after the complete frontend page is rendered.
*
* @param Observer $observer
* @return void
*/
public function execute(Observer $observer): void
{
if (!$this->config->isEnabled()) {
return;
}
$response = $observer->getData('response');
if (!$response instanceof HttpResponse) {
return;
}
$body = (string)$response->getBody();
if (stripos($body, '<html') === false || stripos($body, '<a') === false) {
return;
}
try {
$storeCode = (string)$this->storeManager->getStore()->getCode();
$language = $this->storeCodeMapper->languageFromStoreCode($storeCode);
if ($language === null) {
return;
}
$response->setBody($this->htmlLinkProcessor->process($body, $language));
} catch (\Throwable $exception) {
$this->logger->error(
'[LanguageUrlStoreResolver] Failed to convert links in page HTML.',
['exception' => $exception]
);
}
}
}