Caut o modalitate de a gestiona 404 pe imagini din Drupal. Am creat mai mulți abonați, dar niciunul nu pare să fie declanșat. Prima mea încercare a fost să creez un abonat care se extinde RouteSubscriberBase
. Metoda alterRoutes arăta astfel:
funcția protejată alterRoutes(RouteCollection $colecție) {
if ($rută = $colecție->get('system.404')) {
$route->setDefault('_controller', '\Drupal\my_module\Controller\ImageRouteController::load');
} altfel {
(..)
}
}
Acest lucru funcționează perfect pentru toate 404, cu excepția imaginilor (se termină în .jpg sau .png). Aceasta va genera în continuare o pagină implicită 404. Este de fapt o versiune ușoară, nu la fel cu un 404 pe o pagină care nu există imagine. Când depanez prin codul Drupal (începând din index.php) văd că trece prin mulți pași înainte de a genera acea lumină 404. Deci ajunge la codul Drupal.
Am găsit un anumit cod interesant (la care se ajunge atunci când se vizitează o imagine inexistentă):
$this->dispatcher->dispatch(KernelEvents::EXCEPTION, $event);
Acest lucru poate fi găsit în mâner
Metodă de Symfony\Component\HttpKernel\HttpKernel
. Cu aceste cunoștințe am reușit să găsesc această pagină: https://www.drupal.org/node/2331613 . Din nou, nu pare să funcționeze. Ce am acum:
my_module.services.yml:
my_module.exception_image_subscriber:
clasa: Drupal\my_module\EventSubscriber\ExceptionImageSubscriber
Etichete:
- { nume: event_subscriber }
src\EventSubscriber\ExceptionImageSubscriber.php (comentarii eliminate):
<?php
spațiu de nume Drupal\modulul_meu\EventSubscriber;
utilizați Drupal\Core\EventSubscriber\HttpExceptionSubscriberBase;
utilizați Symfony\Component\HttpFoundation\Response;
utilizați Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent;
clasa ExceptionImageSubscriber extinde HttpExceptionSubscriberBase {
/**
* {@inheritDoc}
*/
funcția protejată getHandledFormats() {
returnează ['svg','jpg','gif','png','webp'];
}
/**
* {@inheritdoc}
*/
funcția statică protejată getPriority() {
returnează 0;
}
/**
* Gestionează o eroare 404 pentru imagini
*/
funcția publică on404(GetResponseForExceptionEvent $event) {
dd('test'); // <- nu trag?!
}
}
Acest lucru nu pare să facă nimic, nu pentru non-imagini sau pentru imagini.
Încep să cred că problema este că modulele nu sunt încărcate atunci când sunt solicitate imagini. Există vreo modalitate de a ocoli această problemă?