Încercați să creați un abonat la eveniment personalizat. Dacă pagina este 404, luați adresa URL inițială și redirecționați în consecință.
Pentru a face acest lucru, creați un nou modul ("response_test" în acest exemplu), cu fișierele obișnuite .info.yml și .module.
Apoi înregistrează-ți abonatul evenimentului în fișierul de servicii al modulului... (vezi Exemplu de abonat eveniment pentru un exemplu complet.
./response_test.services.yml
Servicii:
response_test.response_subscriber:
clasa: Drupal\response_test\404RedirectResponseSubscriber
Etichete:
- { nume: event_subscriber }
Apoi creați o clasă pentru a gestiona evenimentul
./src/EventSubscriber/404RedirectResponseSubscriber.php
<?php
namespace Drupal\response_test;
utilizați Symfony\Component\HttpKernel\Event\FilterResponseEvent;
utilizați Symfony\Component\HttpKernel\KernelEvents;
utilizați Symfony\Component\HttpKernel\HttpKernelInterface;
utilizați Symfony\Component\EventDispatcher\EventSubscriberInterface;
utilizați Symfony\Component\HttpFoundation\RedirectResponse;
clasa 404RedirectResponseSubscriber implementează EventSubscriberInterface {
funcția publică onRespond(FilterResponseEvent $event) {
dacă ($event->getRequestType() !== HttpKernelInterface::MASTER_REQUEST) {
întoarcere;
}
$răspuns = $eveniment->getResponse();
dacă ($răspuns->getStatusCode() == 404) {
// Ia cumva calea veche
// @vedeți https://stackoverflow.com/q/11047305
$oldPath = ''; // Încercați să utilizați $response->getUri() sau $response->headers->get('location')
// Manipulați $oldPath pentru a elimina ultima parte
// @vedeți https://stackoverflow.com/a/51573313/5771750
$redirectPath = dirname($oldPath);
$new_response = new RedirectResponse($redirectPath );
// Pregătiți un nou Symfony\Component\HttpFoundation\Response și utilizați
$event->setResponse($new_response);
}
}
funcție publică statică getSubscribedEvents() {
$events[KernelEvents::RESPONSE][] = array('onRespond');
returnează $evenimente;
}
}
Notă: Acest răspuns se bazează parțial pe răspunsul lui Clive de aici: https://drupal.stackexchange.com/a/86622