Skip to content

Commit

Permalink
fix: use KernelEvents::EXCEPTION event to handle redirects (#37)
Browse files Browse the repository at this point in the history
  • Loading branch information
tinect authored May 9, 2024
1 parent 41df649 commit be76013
Showing 1 changed file with 27 additions and 17 deletions.
44 changes: 27 additions & 17 deletions src/Subscriber/BeforeSendResponseSubscriber.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@
use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\MultiFilter;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Sorting\FieldSorting;
use Shopware\Core\Framework\Event\BeforeSendResponseEvent;
use Shopware\Core\PlatformRequest;
use Shopware\Core\SalesChannelRequest;
use Shopware\Core\System\SalesChannel\Context\AbstractSalesChannelContextFactory;
Expand All @@ -26,6 +25,9 @@
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Event\ExceptionEvent;
use Symfony\Component\HttpKernel\Exception\HttpException;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\Messenger\MessageBusInterface;
use Tinect\Redirects\Content\Redirect\RedirectEntity;
use Tinect\Redirects\Message\TinectRedirectUpdateMessage;
Expand All @@ -46,21 +48,27 @@ public function __construct(
public static function getSubscribedEvents(): array
{
return [
BeforeSendResponseEvent::class => ['onBeforeSendResponse', 1000],
KernelEvents::EXCEPTION => 'onKernelException',
];
}

public function onBeforeSendResponse(BeforeSendResponseEvent $event): void
public function onKernelException(ExceptionEvent $event): void
{
if ($event->getRequest()->getMethod() !== Request::METHOD_GET) {
$request = $event->getRequest();

if ($request->getMethod() !== Request::METHOD_GET) {
return;
}

if ($event->getResponse()->getStatusCode() !== Response::HTTP_NOT_FOUND) {
$exception = $event->getThrowable();

$is404StatusCode = $exception instanceof HttpException && $exception->getStatusCode() === Response::HTTP_NOT_FOUND;

if (!$is404StatusCode) {
return;
}

$response = $this->handleRequest($event->getRequest());
$response = $this->handleRequest($request);

if ($response instanceof Response) {
$event->setResponse($response);
Expand All @@ -69,17 +77,19 @@ public function onBeforeSendResponse(BeforeSendResponseEvent $event): void

private function handleRequest(Request $request): ?Response
{
$request = $this->requestTransformer->transform(clone $request);
$path = $request->attributes->get(RequestTransformer::SALES_CHANNEL_RESOLVED_URI);
if (!$request->attributes->has(RequestTransformer::ORIGINAL_REQUEST_URI)) {
$request = $this->requestTransformer->transform(clone $request);
}

$path = $request->attributes->getString(RequestTransformer::ORIGINAL_REQUEST_URI);

if (!\is_string($path) || empty($path)) {
if ($path === '') {
return null;
}

$salesChannelBaseUrl = $request->attributes->get(RequestTransformer::SALES_CHANNEL_BASE_URL);
$salesChannelBaseUrl = $request->attributes->getString(RequestTransformer::SALES_CHANNEL_BASE_URL);

if (\is_string($salesChannelBaseUrl)
&& !empty($salesChannelBaseUrl)
if ($salesChannelBaseUrl !== ''
&& \str_starts_with($path, $salesChannelBaseUrl . '/')) {
$path = \substr($path, \strlen($salesChannelBaseUrl));
}
Expand Down Expand Up @@ -129,7 +139,7 @@ private function handleRequest(Request $request): ?Response

$targetURL = $redirect->getTarget();

$host = $request->attributes->get(RequestTransformer::SALES_CHANNEL_ABSOLUTE_BASE_URL)
$host = $request->attributes->getString(RequestTransformer::SALES_CHANNEL_ABSOLUTE_BASE_URL)
. $salesChannelBaseUrl;

$salesChannelContext = $this->getSalesChannelContext($request);
Expand All @@ -151,9 +161,9 @@ private function getSalesChannelContext(Request $request): SalesChannelContext
return $salesChannelContext;
}

$salesChannelId = $request->attributes->get(PlatformRequest::ATTRIBUTE_SALES_CHANNEL_ID);
$salesChannelId = $request->attributes->getString(PlatformRequest::ATTRIBUTE_SALES_CHANNEL_ID);

if (!\is_string($salesChannelId) || empty($salesChannelId)) {
if ($salesChannelId === '') {
throw new \RuntimeException('No sales channel id found in request.');
}

Expand All @@ -180,9 +190,9 @@ private function createSalesChannelContext(string $salesChannelId, string $langu

private function getIpAddress(Request $request): string
{
$salesChannelId = $request->attributes->get(PlatformRequest::ATTRIBUTE_SALES_CHANNEL_ID);
$salesChannelId = $request->attributes->getString(PlatformRequest::ATTRIBUTE_SALES_CHANNEL_ID);

if (!\is_string($salesChannelId) || empty($salesChannelId)) {
if ($salesChannelId === '') {
$salesChannelId = null;
}

Expand Down

0 comments on commit be76013

Please sign in to comment.