diff --git a/core/EventListener/RedirectListener.php b/core/EventListener/RedirectListener.php index 5694ec3..edb7218 100644 --- a/core/EventListener/RedirectListener.php +++ b/core/EventListener/RedirectListener.php @@ -7,6 +7,7 @@ use App\Core\Router\RedirectMatcher; use Symfony\Component\HttpFoundation\RedirectResponse; use Symfony\Component\HttpKernel\Event\ExceptionEvent; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; +use App\Core\Router\RedirectBuilder; /** * class RedirectListener. @@ -16,11 +17,13 @@ use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; class RedirectListener { protected RedirectMatcher $matcher; + protected RedirectBuilder $builder; protected RedirectRepositoryQuery $repository; - public function __construct(RedirectMatcher $matcher, RedirectRepositoryQuery $repository) + public function __construct(RedirectMatcher $matcher, RedirectBuilder $builder, RedirectRepositoryQuery $repository) { $this->matcher = $matcher; + $this->builder = $builder; $this->repository = $repository; } @@ -38,20 +41,9 @@ class RedirectListener ->find() ; - $uri = $event->getRequest()->getUri(); - foreach ($redirects as $redirect) { - if ($this->matcher->match($redirect, $uri)) { - if ($redirect->getReuseQueryString() && count($event->getRequest()->query)) { - $query = sprintf('?%s', http_build_query($event->getRequest()->query->all())); - } else { - $query = ''; - } - - $event->setResponse(new RedirectResponse( - $redirect->getLocation().$query, - $redirect->getRedirectCode() - )); + if ($this->matcher->match($redirect, $event->getRequest()->getUri())) { + $event->setResponse($this->builder->buildResponse($redirect, $event->getRequest())); } } } diff --git a/core/Router/RedirectBuilder.php b/core/Router/RedirectBuilder.php new file mode 100644 index 0000000..774e5fc --- /dev/null +++ b/core/Router/RedirectBuilder.php @@ -0,0 +1,45 @@ + + */ +class RedirectBuilder +{ + public function buildResponse(Redirect $redirect, Request $request): RedirectResponse + { + return new RedirectResponse( + $this->buildUrl($redirect, $request), + $redirect->getRedirectCode() + ); + } + + public function buildUrl(Redirect $redirect, Request $request): string + { + $data = $this->parse($request->getUri()); + + if ('path' === $redirect->getRuleType()) { + $location = $redirect->getLocation(); + } else { + $location = preg_replace('`'.$redirect->getRule().'`sU', $redirect->getLocation(), $data['path']); + } + + if ($redirect->getReuseQueryString() && count($request->query)) { + $location .= sprintf('?%s', http_build_query($request->query->all())); + } + + return $location; + } + + protected function parse($url): array + { + return parse_url($url); + } +}