Рейтинг:3

Пользовательская обработка 404 для изображений

флаг ly

Я ищу способ обработки 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) {
     дд('тест'); // <- не стреляет?!
  }
}

Кажется, это ничего не делает, ни для изображений, ни для изображений.

Я начинаю думать, что проблема в том, что модули не загружаются при запросе изображений. Есть ли способ обойти эту проблему?

Рейтинг:5
флаг cn

Облегченная версия — это быстрые 404 страницы. Они настраиваются в system.performance.yml. Конфигурация может быть изменена в настройки.php. По умолчанию:

$config['system.performance']['fast_404']['paths'] = '/\.(?:txt|png|gif|jpe?g|css|js|ico|swf|flv|cgi|bat |pl|dll|exe|asp)$/i';

Если вы хотите переопределить эту обработку 404 в коде, вашему подписчику на исключение нужен приоритет> 200:

  защищенная статическая функция getPriority() {
    вернуть 300;
  }

и формат должен быть HTML, а не расширения файлов:

  защищенная функция getHandledFormats() {
    вернуть ['html'];
  }

Для справки https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21EventSubscriber%21Fast404ExceptionHtmlSubscriber.php/class/Fast404ExceptionHtmlSubscriber

Frank avatar
флаг ly
Так близко, но так далеко :). Я наткнулся на вариант fast_404, но не нашел решения. Большое спасибо!

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.