Điểm:3

Xử lý 404 tùy chỉnh cho hình ảnh

lá cờ ly

Tôi đang tìm cách xử lý 404 trên hình ảnh trong Drupal. Tôi đã tạo một số người đăng ký, nhưng dường như không có người đăng ký nào được kích hoạt. Lần thử đầu tiên của tôi là tạo người đăng ký mở rộng Tuyến cơ sở thuê bao. Phương thức alterRoutes trông giống như:

chức năng được bảo vệ alterRoutes(RouteCollection $collection) {
    if ($route = $collection->get('system.404')) {
      $route->setDefault('_controller', '\Drupal\my_module\Controller\ImageRouteController::load');
    } khác {
     (..)
    }
  }

Điều này hoạt động hoàn hảo cho tất cả 404 ngoại trừ hình ảnh (kết thúc bằng .jpg hoặc .png). Điều này vẫn sẽ tạo ra một trang 404 mặc định. Đây thực sự là một phiên bản nhẹ, không giống như 404 trên trang không tồn tại hình ảnh. Khi tôi gỡ lỗi thông qua mã Drupal (bắt đầu từ index.php), tôi thấy nó trải qua nhiều bước trước khi tạo ánh sáng 404 đó. Vì vậy, nó đạt đến mã Drupal.

Tôi đã tìm thấy một đoạn mã thú vị cụ thể (có được khi truy cập một hình ảnh không tồn tại):

$this->dispatcher->dispatch(KernelEvents::EXCEPTION, $event);

Điều này có thể được tìm thấy trong xử lý phương pháp của Symfony\Thành phần\HttpKernel\HttpKernel. Với kiến ​​​​thức đó, tôi đã tìm được trang này: https://www.drupal.org/node/2331613 . Một lần nữa, nó dường như không hoạt động. Những gì tôi có bây giờ:

my_module.services.yml:

my_module.Exception_image_subscriber:
    lớp: Drupal\my_module\EventSubscriber\ExceptionImageSubscriber
    thẻ:
      - { tên: event_subscriber }

src\EventSubscriber\ExceptionImageSubscriber.php (đã xóa nhận xét):

<?php
không gian tên Drupal\my_module\EventSubscriber;

sử dụng Drupal\Core\EventSubscriber\HttpExceptionSubscriberBase;
sử dụng Symfony\Thành phần\HttpFoundation\Response;
sử dụng Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent;

lớp ExceptionImageSubscriber mở rộng HttpExceptionSubscriberBase {

  /**
   * {@inheritDoc}
   */
  chức năng được bảo vệ getHandledFormats() {
    return ['svg','jpg','gif','png','webp'];
  }

  /**
   * {@inheritdoc}
   */
  hàm tĩnh được bảo vệ getPriority() {
    trả về 0;
  }

  /**
   * Xử lý lỗi 404 cho hình ảnh
   */
  hàm công khai on404(GetResponseForExceptionEvent $event) {
     đ('kiểm tra'); // <- không kích hoạt?!
  }
}

Điều này dường như không làm bất cứ điều gì, không dành cho hình ảnh hoặc hình ảnh.

Tôi bắt đầu tin rằng vấn đề là các mô-đun không được tải khi hình ảnh được yêu cầu. Có cách nào xung quanh vấn đề này?

Điểm:5
lá cờ cn

Phiên bản trọng lượng nhẹ là các trang 404 nhanh. Chúng được cấu hình trong hệ thống.hiệu suất.yml. Cấu hình có thể được ghi đè trong cài đặt.php. Mặc định là:

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

Nếu bạn muốn ghi đè xử lý 404 này bằng mã, người đăng ký ngoại lệ của bạn cần có mức độ ưu tiên >200:

  hàm tĩnh được bảo vệ getPriority() {
    trả lại 300;
  }

và định dạng phải là html, không phải phần mở rộng tệp:

  chức năng được bảo vệ getHandledFormats() {
    trả về ['html'];
  }

Để tham khảo https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21EventSubscriber%21Fast404ExceptionHtmlSubscriber.php/class/Fast404ExceptionHtmlSubscriber

Frank avatar
lá cờ ly
Rất gần, mà lại rất xa :). Tôi đã tìm thấy tùy chọn fast_404 nhưng không tìm thấy giải pháp. Cảm ơn rất nhiều!

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.