<?php declare(strict_types=1);
namespace CrayssnLabsBase\Storefront\Subscriber;
use CrayssnLabsBase\Command\Util;
use Shopware\Core\Framework\DataAbstractionLayer\EntityRepository;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter;
use Shopware\Storefront\Framework\Routing;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel;
use Symfony\Component\HttpKernel\Event\ResponseEvent;
use Symfony\Component\HttpFoundation;
/**
* Class OrderStateSubscriber
*
* @package CrayssnLabsConfigurator\Storefront\Subscriber
*
* @author Sebastian Ludwig <dev@cl.team>
* @copyright Copyright (c) 2022, CrayssnLabs Ludwig Wiegler GbR
*/
class RequestSubscriber implements EventSubscriberInterface
{
/**
* @var \Shopware\Core\Framework\DataAbstractionLayer\EntityRepository
*/
private EntityRepository $seoUrlRepository;
/**
* @var \Shopware\Storefront\Framework\Routing\Router
*/
private Routing\Router $router;
/**
* @param \Shopware\Core\Framework\DataAbstractionLayer\EntityRepository $seoUrlRepository
* @param \Shopware\Storefront\Framework\Routing\Router $router
*/
public function __construct(
EntityRepository $seoUrlRepository,
Routing\Router $router
)
{
$this->seoUrlRepository = $seoUrlRepository;
$this->router = $router;
}
/**
* Function getSubscribedEvents
*
* @return string[]
*/
public static function getSubscribedEvents(): array
{
// Return the events to listen to as array like this: <event to listen to> => <method to execute>
return [
HttpKernel\KernelEvents::RESPONSE => ['onResponse', -5]
];
}
/**
* Function onResponse
*
* @param \Symfony\Component\HttpKernel\Event\ResponseEvent $event
*/
public function onResponse(ResponseEvent $event)
{
if($event->getResponse()->getStatusCode() === HttpFoundation\Response::HTTP_NOT_FOUND)
{
$event->stopPropagation();
$response = $event->getResponse();
$response->setStatusCode(301);
$uri = trim($event->getRequest()->getRequestUri(), '/');
$uri = Util::slugify($uri);
$uri = str_replace('/', '-', $uri);
$searchResult = $this->seoUrlRepository->search((new Criteria())->addFilter(new Filter\EqualsFilter('seoPathInfo', $uri . '/')), Util::getContext());
if($searchResult->count() > 0)
{
$response->headers->set('location', '/' . $searchResult->first()->getSeoPathInfo());
return;
}
$uri = $this->router->generate('frontend.search.page', [
'search' => str_replace(['/', '-'], ' ', $uri)
]);
$response->headers->set('location', $uri);
$event->stopPropagation();
}
}
}