Puncte:3

Manipulare personalizată 404 pentru imagini

drapel ly

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ă?

Puncte:5
drapel cn

Versiunea ușoară este rapidă de 404 de pagini. Sunt configurabile în sistem.performanță.yml. Configurația poate fi suprascrisă în setări.php. Valoarea implicită este:

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

Dacă doriți să suprascrieți această gestionare 404 în cod, abonatul dvs. de excepție are nevoie de o prioritate >200:

  funcția statică protejată getPriority() {
    întoarce 300;
  }

iar formatul trebuie să fie html, nu extensiile de fișiere:

  funcția protejată getHandledFormats() {
    return ['html'];
  }

Pentru trimitere https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21EventSubscriber%21Fast404ExceptionHtmlSubscriber.php/class/Fast404ExceptionHtmlSubscriber

Frank avatar
drapel ly
Atât de aproape, dar atât de departe :). Am dat peste opțiunea fast_404, dar nu am găsit soluția. Mulțumesc mult!

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.