Hallo Leute,
meine Intention ist es, alle 404 Errors mit einer Produktnummer in der URL weiterzuleiten auf die Startseite, alle anderen nicht. Momentan wird aber prinzipiell alles weitergeleitet, auch wenn anhand der Log hervorgeht, dass kein Redirect stattfindet. Was läuft da schief?
Klasse URLSubscriber:
<?php declare(strict_types=1);
namespace WtChangeURL\Subscriber;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\ResponseEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use WtChangeURL\classes\RedirectException;
use WtChangeURL\classes\Paths;
use DateTime;
use DateInterval;
class URLSubscriber implements EventSubscriberInterface {
public static function getSubscribedEvents(): array {
// Return the events to listen to as array like this: <event to listen to> => <method to execute>
return [
KernelEvents::RESPONSE => 'onKernelResponse',
];
}
public function onKernelResponse(ResponseEvent $event): void {
file_put_contents($this->logFile(), $this->getDateNTime() . ":: Das Plugin WtChangeURL wurde erfolgreich aufgerufen" . PHP_EOL, FILE_APPEND);
$ar400Error = array(404);
$arNumbers = [10, 11, 12];
$response = $event->getResponse();
$responseFound = $response->isNotFound();
if ($responseFound) {
$wurdeGefunden = "Nein";
} else {
$wurdeGefunden = "Ja";
}
$isRedirect = $response->isRedirect();
if ($isRedirect) {
$wurdeWeiterGeleitet = "Ja";
} else {
$wurdeWeiterGeleitet = "Nein";
}
$requestURL = $event->getRequest()->getUri();
$statusCode = $response->getStatusCode();
//check, how many numbers are in reuquest url
$countDigits = 0;
for ($i = 0; $i < strlen($requestURL); $i++) {
if (is_numeric($requestURL[$i])) {
$countDigits++;
}
}
file_put_contents($this->logFile(), $this->getDateNTime() . ":: Status Code:$statusCode" . PHP_EOL, FILE_APPEND);
if (in_array($statusCode, $ar400Error) && in_array($countDigits, $arNumbers)) {
$url = 'http://myshop.de/';
file_put_contents($this->logFile(), $this->getDateNTime() . ":: Anzahl der Nummern in der URL $countDigits" . PHP_EOL, FILE_APPEND);
file_put_contents($this->logFile(), $this->getDateNTime() . ":: Da der Response den Statuscode $statusCode beinhaltet, wird versucht auf die URL:$url weitergeleitet." . PHP_EOL, FILE_APPEND);
throw new RedirectException($url);
} else {
file_put_contents($this->logFile(), $this->getDateNTime() . "::Request URL:$requestURL" . PHP_EOL, FILE_APPEND);
file_put_contents($this->logFile(), $this->getDateNTime() . "::Response will be found: $wurdeGefunden and redirected:$wurdeWeiterGeleitet" . PHP_EOL, FILE_APPEND);
file_put_contents($this->logFile(), $this->getDateNTime() . "::Redirecting by code has not been activated!" . PHP_EOL, FILE_APPEND);
}
}
private function logFile(): string {
$objPath = new Paths();
return $objPath->getLogFile();
}
private function getDateNTime(): string {
$now = new DateTime();
$now = $now->add(new DateInterval('PT2H'));
return $now->format('Y-m-d H:i:s');
}
}
die Klasse ExceptionSubscriber:
<?php declare(strict_types=1);
namespace WtChangeURL\Subscriber;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\ExceptionEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\HttpFoundation\RedirectResponse;
use WtChangeURL\classes\RedirectException;
use DateTime;
use WtChangeURL\classes\Paths;
use DateInterval;
class ExceptionSubscriber implements EventSubscriberInterface {
public static function getSubscribedEvents(): array {
return [
KernelEvents::EXCEPTION => [
['redirectOnException', 0]
],
];
}
public function redirectOnException(ExceptionEvent $event): void {
$exception = $event->getThrowable();
if ($exception instanceof RedirectException) {
$response = new RedirectResponse($exception->getUri());
$route = $exception->getUri();
file_put_contents($this->logFile(), $this->getDateNTime() . "::Exeption ist RedirectException. Es wurde auf die Route $route weitergeleitet!" . PHP_EOL, FILE_APPEND);
$event->setResponse($response);
}
}
private function logFile(): string {
$objPath = new Paths();
return $objPath->getLogFile();
}
private function getDateNTime(): string {
$now = new DateTime();
$now = $now->add(new DateInterval('PT2H'));
return $now->format('Y-m-d H:i:s');
}
}