2022-02-15 10:05:33 +01:00
|
|
|
<?php
|
|
|
|
|
|
|
|
namespace App\Core\Router;
|
|
|
|
|
|
|
|
use App\Core\Entity\Redirect;
|
2022-02-16 17:09:39 +01:00
|
|
|
use App\Core\String\UrlBuilder;
|
2022-02-15 10:05:33 +01:00
|
|
|
use Symfony\Component\HttpFoundation\RedirectResponse;
|
|
|
|
use Symfony\Component\HttpFoundation\Request;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* class RedirectBuilder.
|
|
|
|
*
|
|
|
|
* @author Simon Vieille <simon@deblan.fr>
|
|
|
|
*/
|
|
|
|
class RedirectBuilder
|
|
|
|
{
|
2022-02-16 17:09:39 +01:00
|
|
|
protected UrlBuilder $urlBuilder;
|
|
|
|
|
|
|
|
public function __construct(UrlBuilder $urlBuilder)
|
|
|
|
{
|
|
|
|
$this->urlBuilder = $urlBuilder;
|
|
|
|
}
|
|
|
|
|
2022-02-15 10:05:33 +01:00
|
|
|
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']);
|
|
|
|
}
|
|
|
|
|
2022-02-16 17:09:39 +01:00
|
|
|
$location = $this->urlBuilder->replaceTags($location);
|
|
|
|
|
2022-02-15 10:05:33 +01:00
|
|
|
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);
|
|
|
|
}
|
|
|
|
}
|