12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091 |
- <?php
- /**
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
- declare(strict_types=1);
- namespace Magento\UrlRewrite\Model\StoreSwitcher;
- use Magento\Store\Api\Data\StoreInterface;
- use Magento\Store\Model\StoreSwitcherInterface;
- use Magento\UrlRewrite\Model\UrlFinderInterface;
- use Magento\UrlRewrite\Service\V1\Data\UrlRewrite;
- /**
- * Handle url rewrites for redirect url
- */
- class RewriteUrl implements StoreSwitcherInterface
- {
- /**
- * @var UrlFinderInterface
- */
- private $urlFinder;
- /**
- * @var \Magento\Framework\HTTP\PhpEnvironment\RequestFactory
- */
- private $requestFactory;
- /**
- * @param UrlFinderInterface $urlFinder
- * @param \Magento\Framework\HTTP\PhpEnvironment\RequestFactory $requestFactory
- */
- public function __construct(
- UrlFinderInterface $urlFinder,
- \Magento\Framework\HTTP\PhpEnvironment\RequestFactory $requestFactory
- ) {
- $this->urlFinder = $urlFinder;
- $this->requestFactory = $requestFactory;
- }
- /**
- * Switch to another store.
- *
- * @param StoreInterface $fromStore
- * @param StoreInterface $targetStore
- * @param string $redirectUrl
- * @return string
- */
- public function switch(StoreInterface $fromStore, StoreInterface $targetStore, string $redirectUrl): string
- {
- $targetUrl = $redirectUrl;
- /** @var \Magento\Framework\HTTP\PhpEnvironment\Request $request */
- $request = $this->requestFactory->create(['uri' => $targetUrl]);
- $urlPath = ltrim($request->getPathInfo(), '/');
- if ($targetStore->isUseStoreInUrl()) {
- // Remove store code in redirect url for correct rewrite search
- $storeCode = preg_quote($targetStore->getCode() . '/', '/');
- $pattern = "@^($storeCode)@";
- $urlPath = preg_replace($pattern, '', $urlPath);
- }
- $oldStoreId = $fromStore->getId();
- $oldRewrite = $this->urlFinder->findOneByData([
- UrlRewrite::REQUEST_PATH => $urlPath,
- UrlRewrite::STORE_ID => $oldStoreId,
- ]);
- if ($oldRewrite) {
- $targetUrl = $targetStore->getBaseUrl();
- // look for url rewrite match on the target store
- $currentRewrite = $this->urlFinder->findOneByData([
- UrlRewrite::TARGET_PATH => $oldRewrite->getTargetPath(),
- UrlRewrite::STORE_ID => $targetStore->getId(),
- ]);
- if ($currentRewrite) {
- $targetUrl .= $currentRewrite->getRequestPath();
- }
- } else {
- $existingRewrite = $this->urlFinder->findOneByData([
- UrlRewrite::REQUEST_PATH => $urlPath
- ]);
- if ($existingRewrite) {
- /** @var \Magento\Framework\App\Response\Http $response */
- $targetUrl = $targetStore->getBaseUrl();
- }
- }
- return $targetUrl;
- }
- }
|