Score:3

การจัดการ 404 แบบกำหนดเองสำหรับรูปภาพ

ธง ly

ฉันกำลังมองหาวิธีจัดการกับ 404 บนรูปภาพใน Drupal ฉันได้สร้างสมาชิกหลายคน แต่ดูเหมือนจะไม่มีใครถูกกระตุ้น ความพยายามครั้งแรกของฉันคือการสร้างสมาชิกที่ขยายออกไป เส้นทางสมาชิกฐาน. วิธีการ alterRoutes มีลักษณะดังนี้:

ฟังก์ชันที่ได้รับการป้องกัน alterRoutes (RouteCollection $collection) {
    ถ้า ($route = $collection->get('system.404')) {
      $route->setDefault('_controller', '\Drupal\my_module\Controller\ImageRouteController::load');
    } อื่น {
     (..)
    }
  }

ใช้งานได้ดีกับ 404 ทั้งหมด ยกเว้นรูปภาพ (ลงท้ายด้วย .jpg หรือ .png) สิ่งนี้จะยังคงสร้างหน้า 404 เริ่มต้น เป็นรุ่นที่มีน้ำหนักเบา ไม่เหมือนกับ 404 ในหน้าที่ไม่มีรูปภาพ เมื่อฉันดีบักผ่านโค้ด Drupal (เริ่มต้นที่ index.php) ฉันเห็นว่ามันต้องผ่านหลายขั้นตอนก่อนที่จะสร้าง light 404 นั้น ดังนั้นมันจึงไปถึงโค้ด Drupal

ฉันพบรหัสที่น่าสนใจอย่างหนึ่ง (ซึ่งเข้าถึงได้เมื่อไปที่รูปภาพที่ไม่มีอยู่):

$this->dispatcher->ส่ง (KernelEvents::EXCEPTION, $event);

นี้ได้ใน รับมือ วิธีการ Symfony\Component\HttpKernel\HttpKernel. ด้วยความรู้นั้นฉันจึงพบหน้านี้: https://www.drupal.org/node/2331613 . อีกครั้งดูเหมือนจะไม่ทำงาน สิ่งที่ฉันมีตอนนี้:

my_module.services.yml:

my_module.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

class ExceptionImageSubscriber ขยาย HttpExceptionSubscriberBase {

  /**
   * {@inheritDoc}
   */
  ฟังก์ชั่นที่ได้รับการป้องกัน getHandledFormats () {
    กลับ ['svg','jpg','gif','png','webp'];
  }

  /**
   * {@inheritdoc}
   */
  ฟังก์ชันสแตติกที่ได้รับการป้องกัน getPriority () {
    กลับ 0;
  }

  /**
   * จัดการข้อผิดพลาด 404 สำหรับรูปภาพ
   */
  ฟังก์ชั่นสาธารณะ on404 (GetResponseForExceptionEvent $event) {
     dd('ทดสอบ'); // <- ไม่ยิง?!
  }
}

ดูเหมือนจะไม่ทำอะไรเลย ไม่ใช่สำหรับภาพที่ไม่ใช่หรือสำหรับภาพ

ฉันเริ่มเชื่อว่าปัญหาคือโมดูลไม่โหลดเมื่อมีการร้องขออิมเมจ มีวิธีแก้ไขปัญหานี้หรือไม่?

Score:5
ธง cn

รุ่นน้ำหนักเบาเร็ว 404 หน้า สามารถกำหนดค่าได้ใน ระบบ.ประสิทธิภาพ.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 flag
ใกล้แต่กลับไกล :) ฉันเจอตัวเลือก fast_404 แต่ไม่พบวิธีแก้ปัญหา ขอบคุณมาก!

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา