backports murph-skeleton
This commit is contained in:
parent
c2139de3af
commit
ed6a13d773
|
@ -7,6 +7,7 @@ use App\Core\Router\RedirectMatcher;
|
||||||
use Symfony\Component\HttpFoundation\RedirectResponse;
|
use Symfony\Component\HttpFoundation\RedirectResponse;
|
||||||
use Symfony\Component\HttpKernel\Event\ExceptionEvent;
|
use Symfony\Component\HttpKernel\Event\ExceptionEvent;
|
||||||
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
|
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
|
||||||
|
use App\Core\Router\RedirectBuilder;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* class RedirectListener.
|
* class RedirectListener.
|
||||||
|
@ -16,11 +17,13 @@ use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
|
||||||
class RedirectListener
|
class RedirectListener
|
||||||
{
|
{
|
||||||
protected RedirectMatcher $matcher;
|
protected RedirectMatcher $matcher;
|
||||||
|
protected RedirectBuilder $builder;
|
||||||
protected RedirectRepositoryQuery $repository;
|
protected RedirectRepositoryQuery $repository;
|
||||||
|
|
||||||
public function __construct(RedirectMatcher $matcher, RedirectRepositoryQuery $repository)
|
public function __construct(RedirectMatcher $matcher, RedirectBuilder $builder, RedirectRepositoryQuery $repository)
|
||||||
{
|
{
|
||||||
$this->matcher = $matcher;
|
$this->matcher = $matcher;
|
||||||
|
$this->builder = $builder;
|
||||||
$this->repository = $repository;
|
$this->repository = $repository;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -38,20 +41,9 @@ class RedirectListener
|
||||||
->find()
|
->find()
|
||||||
;
|
;
|
||||||
|
|
||||||
$uri = $event->getRequest()->getUri();
|
|
||||||
|
|
||||||
foreach ($redirects as $redirect) {
|
foreach ($redirects as $redirect) {
|
||||||
if ($this->matcher->match($redirect, $uri)) {
|
if ($this->matcher->match($redirect, $event->getRequest()->getUri())) {
|
||||||
if ($redirect->getReuseQueryString() && count($event->getRequest()->query)) {
|
$event->setResponse($this->builder->buildResponse($redirect, $event->getRequest()));
|
||||||
$query = sprintf('?%s', http_build_query($event->getRequest()->query->all()));
|
|
||||||
} else {
|
|
||||||
$query = '';
|
|
||||||
}
|
|
||||||
|
|
||||||
$event->setResponse(new RedirectResponse(
|
|
||||||
$redirect->getLocation().$query,
|
|
||||||
$redirect->getRedirectCode()
|
|
||||||
));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
45
core/Router/RedirectBuilder.php
Normal file
45
core/Router/RedirectBuilder.php
Normal file
|
@ -0,0 +1,45 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Core\Router;
|
||||||
|
|
||||||
|
use App\Core\Entity\Redirect;
|
||||||
|
use Symfony\Component\HttpFoundation\RedirectResponse;
|
||||||
|
use Symfony\Component\HttpFoundation\Request;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* class RedirectBuilder.
|
||||||
|
*
|
||||||
|
* @author Simon Vieille <simon@deblan.fr>
|
||||||
|
*/
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue