123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149 |
- <?php
- /**
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
- namespace Magento\UrlRewrite\Controller;
- use Magento\Framework\App\RequestInterface;
- use Magento\UrlRewrite\Controller\Adminhtml\Url\Rewrite;
- use Magento\UrlRewrite\Model\UrlFinderInterface;
- use Magento\UrlRewrite\Service\V1\Data\UrlRewrite;
- use Magento\Framework\App\Request\Http as HttpRequest;
- use Magento\Framework\App\Response\Http as HttpResponse;
- use Magento\Framework\UrlInterface;
- use Magento\Framework\App\Action\Redirect;
- use Magento\Framework\App\ActionInterface;
- /**
- * UrlRewrite Controller Router
- *
- * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
- */
- class Router implements \Magento\Framework\App\RouterInterface
- {
- /**
- * @var \Magento\Framework\App\ActionFactory
- */
- protected $actionFactory;
- /**
- * @var UrlInterface
- */
- protected $url;
- /**
- * @var \Magento\Store\Model\StoreManagerInterface
- */
- protected $storeManager;
- /**
- * @var HttpResponse
- */
- protected $response;
- /**
- * @var \Magento\UrlRewrite\Model\UrlFinderInterface
- */
- protected $urlFinder;
- /**
- * @param \Magento\Framework\App\ActionFactory $actionFactory
- * @param UrlInterface $url
- * @param \Magento\Store\Model\StoreManagerInterface $storeManager
- * @param \Magento\Framework\App\ResponseInterface $response
- * @param UrlFinderInterface $urlFinder
- */
- public function __construct(
- \Magento\Framework\App\ActionFactory $actionFactory,
- UrlInterface $url,
- \Magento\Store\Model\StoreManagerInterface $storeManager,
- \Magento\Framework\App\ResponseInterface $response,
- UrlFinderInterface $urlFinder
- ) {
- $this->actionFactory = $actionFactory;
- $this->url = $url;
- $this->storeManager = $storeManager;
- $this->response = $response;
- $this->urlFinder = $urlFinder;
- }
- /**
- * Match corresponding URL Rewrite and modify request.
- *
- * @param RequestInterface|HttpRequest $request
- *
- * @return ActionInterface|null
- */
- public function match(RequestInterface $request)
- {
- $rewrite = $this->getRewrite(
- $request->getPathInfo(),
- $this->storeManager->getStore()->getId()
- );
- if ($rewrite === null) {
- //No rewrite rule matching current URl found, continuing with
- //processing of this URL.
- return null;
- }
- if ($rewrite->getRedirectType()) {
- //Rule requires the request to be redirected to another URL
- //and cannot be processed further.
- return $this->processRedirect($request, $rewrite);
- }
- //Rule provides actual URL that can be processed by a controller.
- $request->setAlias(
- UrlInterface::REWRITE_REQUEST_PATH_ALIAS,
- $rewrite->getRequestPath()
- );
- $request->setPathInfo('/' . $rewrite->getTargetPath());
- return $this->actionFactory->create(
- \Magento\Framework\App\Action\Forward::class
- );
- }
- /**
- * @param RequestInterface $request
- * @param UrlRewrite $rewrite
- *
- * @return ActionInterface|null
- */
- protected function processRedirect($request, $rewrite)
- {
- $target = $rewrite->getTargetPath();
- if ($rewrite->getEntityType() !== Rewrite::ENTITY_TYPE_CUSTOM
- || ($prefix = substr($target, 0, 6)) !== 'http:/' && $prefix !== 'https:'
- ) {
- $target = $this->url->getUrl('', ['_direct' => $target]);
- }
- return $this->redirect($request, $target, $rewrite->getRedirectType());
- }
- /**
- * @param RequestInterface|HttpRequest $request
- * @param string $url
- * @param int $code
- * @return ActionInterface
- */
- protected function redirect($request, $url, $code)
- {
- $this->response->setRedirect($url, $code);
- $request->setDispatched(true);
- return $this->actionFactory->create(Redirect::class);
- }
- /**
- * @param string $requestPath
- * @param int $storeId
- * @return UrlRewrite|null
- */
- protected function getRewrite($requestPath, $storeId)
- {
- return $this->urlFinder->findOneByData([
- UrlRewrite::REQUEST_PATH => ltrim($requestPath, '/'),
- UrlRewrite::STORE_ID => $storeId,
- ]);
- }
- }
|