<?php
namespace KmPitchPrint\ExceptionListener;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\SuffixFilter;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Grouping\FieldGrouping;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Event\ExceptionEvent;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Shopware\Core\Framework\DataAbstractionLayer\EntityRepositoryInterface;
use Shopware\Core\Framework\Context;
use \LogicException;
class ExceptionSubscriber
{
const URL = 'https://www.kartenmachen.de/';
/**
* @var $seoUrlRepository EntityRepositoryInterface
*/
private EntityRepositoryInterface $seoUrlRepository;
public function __construct(
EntityRepositoryInterface $seoUrlRepository
){
$this->seoUrlRepository = $seoUrlRepository;
}
public function __invoke(ExceptionEvent $event): void
{
// You get the exception object from the received event
$exception = $event->getThrowable();
if($exception instanceof LogicException ){
if(strstr($event->getRequest()->getRequestUri(),'account/order')){
$response = new RedirectResponse(self::URL.'/account/order');
$event->setResponse($response);
}
}
if($exception instanceof NotFoundHttpException ){
$response = false;
$hardCodedMap = [
'/geburtstagskarten/einladungskarten-geburtstag.html'=>'Geburtstag/Einladungskarten-Geburtstag/',
'/geburtstagskarten/einladungskarten-geburtstag/witzig.html'=>'Geburtstag/Einladungskarten-Geburtstag/Witzige-Einladungen/',
'/anlaesse/einschulung/einladungskarten-einschulung.html'=>'Andere-Anlaesse/Einschulung/Einladungskarten-Einschulung/',
'/anlaesse/jugendweihekarten/einladungskarten-jugendweihe.html'=>'Andere-Anlaesse/Jugendweihe/Jugendweihe-Einladungen/',
'/geburtstagskarten/einladungskarten-geburtstag/mottoparty.html'=>'Geburtstag/Einladungskarten-Geburtstag/Mottoparty-Einladung/',
'/buecher/gaestebuch/hochzeit-gaestebuch.html'=>'Buecher/Gaestebuch/Hochzeit-Gaestebuch/',
'/anlaesse/konfirmationskarten/einladungskarten-konfirmation.html'=>'Andere-Anlaesse/Konfirmation/Konfirmationseinladungen/',
'/geburtstag-einladungskarten-zum-brunch.html'=>'Geburtstag-Einladungskarten-zum-Brunch/EGD100185S',
'/geburtstagskarten/einladungskarten-geburtstag/eintrittskarten.html'=>'Geburtstag/Einladungskarten-Geburtstag/Geburtstag-Eintrittskarten/',
'/anlaesse/jugendweihekarten.html'=>'Andere-Anlaesse/Jugendweihe/',
'/anlaesse/kommunionskarten/einladungskarten-kommunion.html'=>'Andere-Anlaesse/Kommunion/Kommunionseinladungen/',
'/geburtstag-einladungskarten-fotogruss-mit-postkarte.html'=>'Geburtstag-Einladungskarten-Fotogruss-mit-Postkarte/EGD100151S',
'/geburtstagskarten/einladungskarten-geburtstag/party-einladung.html'=>'Geburtstag/Einladungskarten-Geburtstag/Party-Einladungen/',
'/einladungskarte-als-rezept-rosa.html'=>'Einladungskarte-als-Rezept-Rosa/EGD100004S-ROSA',
'/einladungskarten-als-krankschreibung-gelb.html'=>'Einladungskarte-als-Krankschreibung-Gelb/EGD100004S-GELB',
'/geburtstag-partyeinladungen-uberraschungsparty.html'=>'Geburtstag-Partyeinladungen-UEberraschungsparty/EGD100065S',
'/geburtstagskarten/tischkarten-geburtstag.html'=>'Geburtstag/Tischkarten-Geburtstag/',
];
$requestUri = $event->getRequest()->getRequestUri();
//find matches in the hardCodedMap first
foreach ($hardCodedMap as $key =>$val){
if($requestUri == $key){
$response = new RedirectResponse(self::URL.
$val, Response::HTTP_MOVED_PERMANENTLY);
$event->setResponse($response);
break;
}
}
//in no matches in hardCodedMap, compare the seo urls from Database
if (!$response){
$pattern = str_replace('.html','', $requestUri);
$offset = strripos($pattern, '/') + 1;
$pattern = substr($pattern, $offset);
$context = Context::createDefaultContext();
$criteria = new Criteria();
$criteria->addFilter(new SuffixFilter('seoPathInfo',$pattern.'/'));
$criteria->addFilter(new EqualsFilter('routeName','frontend.navigation.page'));
$criteria->addGroupField(new FieldGrouping('seoPathInfo'));
$urlResult = $this->seoUrlRepository->search($criteria, $context);
if($urlResult->getTotal() > 0){
$response = new RedirectResponse(self::URL.
$urlResult->first()->getSeoPathInfo(), Response::HTTP_MOVED_PERMANENTLY);
$event->setResponse($response);
}
}
}
}
}