Я ищу способ обработки 404 на изображениях в Drupal. Я создал несколько подписчиков, но ни один из них не активируется. Моей первой попыткой было создать подписчика, который расширяет Маршрутабонентская база
. Метод alterRoutes выглядел так:
защищенная функция alterRoutes(RouteCollection $ collection) {
если ($маршрут = $коллекция->получить('система.404')) {
$route->setDefault('_controller', '\Drupal\my_module\Controller\ImageRouteController::load');
} еще {
(..)
}
}
Это отлично работает для всех 404, кроме изображений (оканчивающихся на .jpg или .png). Это по-прежнему будет генерировать страницу 404 по умолчанию. На самом деле это облегченная версия, не то же самое, что 404 на несуществующей странице без изображения. Когда я отлаживаю код Drupal (начиная с index.php), я вижу, что он проходит много шагов, прежде чем сгенерировать этот свет 404. Таким образом, он достигает кода Drupal.
Я нашел один особенно интересный фрагмент кода (который достигается при посещении несуществующего изображения):
$this->dispatcher->dispatch(KernelEvents::EXCEPTION, $event);
Это можно найти в справиться
метод Symfony\Component\HttpKernel\HttpKernel
. С этими знаниями мне удалось найти эту страницу: https://www.drupal.org/node/2331613 . Опять же, похоже, это не работает. Что у меня есть сейчас:
мой_модуль.services.yml:
мой_модуль.exception_image_subscriber:
класс: Drupal\my_module\EventSubscriber\ExceptionImageSubscriber
теги:
- {имя: event_subscriber}
src\EventSubscriber\ExceptionImageSubscriber.php (удалены комментарии):
<?php
пространство имен Drupal\my_module\EventSubscriber;
используйте Drupal\Core\EventSubscriber\HttpExceptionSubscriberBase;
используйте Symfony\Component\HttpFoundation\Response;
используйте Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent;
класс ExceptionImageSubscriber расширяет HttpExceptionSubscriberBase {
/**
* {@inheritDoc}
*/
защищенная функция getHandledFormats() {
return ['svg','jpg','gif','png','webp'];
}
/**
* {@inheritdoc}
*/
защищенная статическая функция getPriority() {
вернуть 0;
}
/**
* Обрабатывает ошибку 404 для изображений
*/
общедоступная функция on404 (GetResponseForExceptionEvent $event) {
дд('тест'); // <- не стреляет?!
}
}
Кажется, это ничего не делает, ни для изображений, ни для изображений.
Я начинаю думать, что проблема в том, что модули не загружаются при запросе изображений. Есть ли способ обойти эту проблему?