backports murph-skeleton

This commit is contained in:
Simon Vieille 2022-02-15 10:06:46 +01:00
parent c2139de3af
commit ed6a13d773
2 changed files with 51 additions and 14 deletions

View file

@ -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()));
}
}
}

View 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);
}
}