Score:0

EventSubscriber เพื่อเพิ่มบริบทแคชสำหรับเส้นทางเฉพาะ

ธง cn

ฉันกำลังทำงานกับโมดูล Mobile Detect และจากสิ่งที่ฉันเข้าใจ เราต้องเพิ่มบริบทแคชด้วยตนเอง mobile_detect_is_mobile เพื่อให้หน้าแคชแตกต่างกันไปตามประเภทอุปกรณ์ของผู้ใช้ ฉันสามารถทำให้มันใช้งานได้โดยใช้บริบทแคชโดยใช้การประมวลผลล่วงหน้าในย่อหน้าของฉันดังนี้:

ฟังก์ชัน hook_preprocess_paragraph(&$ตัวแปร){
    $variables['#cache']['contexts'][] = 'mobile_detect_is_mobile';
}

แม้ว่าฉันไม่ชอบแนวคิดในการเพิ่มบริบทที่ระดับการประมวลผลล่วงหน้า และฉันกำลังมองหาโซลูชันที่เป็นสากลมากขึ้นโดยใช้ EventSubscriber ที่ตรวจสอบเส้นทางและใช้บริบทแคชสำหรับเส้นทางเฉพาะ ดูเหมือนว่าบริบทของแคชจะไม่ได้รับการพิจารณา ที่นี่ผู้สมัครสมาชิกกิจกรรมของฉัน:

คลาส MobileDetectSubscriber ใช้ EventSubscriberInterface {

    /**
     * @var \Symfony\Component\HttpFoundation\Request
     */
    คำขอป้องกัน $;

    /**
     * @param \Symfony\Component\HttpFoundation\RequestStack $request_stack
     */
    ฟังก์ชั่นสาธารณะ __construct (RequestStack $request_stack) {
    $this->request = $request_stack->getCurrentRequest();;
    }

    /**
     * @param \Symfony\Component\HttpKernel\Event\FilterResponseEvent $event
     * เหตุการณ์ที่ต้องดำเนินการ
     */
    ฟังก์ชั่นสาธารณะ onRespond (FilterResponseEvent $event) {
        ถ้า (!$event
            ->isMasterRequest()) {
            กลับ;
        }
        $response = $event
            ->getResponse();
        ถ้า (!$response อินสแตนซ์ของ CacheableResponseInterface) {
            กลับ;
        }

        ถ้า ($ this->request->getRequestUri() == "/"){ 
            $mobile_detect = ใหม่ CacheableMetadata();
            $mobile_detect->setCacheContexts(['mobile_detect_is_mobile']);
            $response->addCacheableDependency($mobile_detect);
        }
    }

    /**
     * @return อาร์เรย์
     * อาร์เรย์ของคำจำกัดความของผู้ฟังเหตุการณ์
     */
    ฟังก์ชั่นคงที่สาธารณะ getSubscribedEvents () {
        // ลำดับความสำคัญ 5 เพื่อให้ทำงานก่อน FinishResponseSubscriber แต่หลังจากนั้น
        // สมาชิกเหตุการณ์ที่เพิ่มข้อมูลเมตาความสามารถในการแคชที่เกี่ยวข้อง (ซึ่ง
        // มีลำดับความสำคัญ 10). อันนี้เป็นเงื่อนไขดังนั้นต้องวิ่งตามหลัง
        $events[KernelEvents::RESPONSE][] = ['onRespond', 5];
        ส่งคืนเหตุการณ์ $;
    }
}

ฉันพลาดอะไรไป

miststudent2011 avatar
fr flag
คุณได้เขียน services.yml ด้วยหรือไม่?
Score:2
ธง cn

การเพิ่มบริบทแคชในการตอบกลับนั้นไม่ใช่แบบสากล มันค่อนข้างตรงกันข้ามเฉพาะในกรณีที่คุณใส่บริบทแคชในองค์ประกอบการเรนเดอร์เดียวกันซึ่งขึ้นอยู่กับบริบทนี้ จะสามารถรวมเข้ากับระดับการแคชทั้งหมดที่ได้รับผลกระทบ ในตัวอย่างนี้ บริบทของย่อหน้าจะถูกรวมเข้ากับโหนดพาเรนต์และจากนั้นกับเพจ ย่อหน้าและโหนดอาจอยู่ในบล็อกหรือมุมมองก็ได้ องค์ประกอบทั้งหมดเหล่านี้ต้องการบริบทแคชนั้น

การเพิ่มบริบทแคชในเบ็ดการประมวลผลล่วงหน้าเป็นทางเลือกสุดท้ายในกระบวนการแสดงเทมเพลต มีโค้ดพิเศษใน Drupal ที่ตรวจสอบค่าตัวแปรบนสุดของ $variables ของ preprocess hook และรวมข้อมูลเมตาแคชเข้ากับเทมเพลต

อย่างไรก็ตาม แนวคิดเบื้องหลังเมทาดาทาของแคชคือการเพิ่มโดยตรงไปยังอาร์เรย์บิลด์เมื่อสร้างเนื้อหาในโค้ด เพื่อให้สามารถสร้างฟองได้ถึงเทมเพลตทั้งหมดที่เกี่ยวข้อง วิธีนี้ใช้ได้ผลเมื่อทำการ refactoring รหัสเป็นฟังก์ชันที่ใช้ในที่ต่างๆ ตัวอย่างเช่น ฟังก์ชัน Twig:

$สร้าง = [];
// สร้างเนื้อหา
$build['#cache']['contexts'][] = 'mobile_detect_is_mobile';
// ส่งคืนอาร์เรย์บิลด์ที่จะแสดงผลใน {{ }}
ส่งคืน $build;
// หรือถ้าฟังก์ชัน Twig ของคุณไม่ส่งคืน $build bubble up อย่างน้อยเมทาดาทา 
// โดยแสดงผลภายในฟังก์ชัน Twig
\Drupal::service('renderer')->render($build);

โพสต์คำตอบ

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