ฉันจะปิดใช้งาน Twig และบล็อกแคชสำหรับโมดูลเฉพาะได้อย่างไร


15

ฉันกำลังทำงานกับโมดูลใน Drupal 8 ซึ่งดึงข้อมูลเวลาที่สำคัญจาก REST api ภายนอก ข้อมูลจะถูกประมวลผลและส่งต่อไปยังบล็อก ข้อมูลสุดท้ายจะถูกส่งไปยังเทมเพลต Twig ดังนี้:

...

public function build() {
  $build = [];

  $build['ticker_block'] = [
    '#theme' => 'module_theme',
    '#data' => $myService->data(),
  ];

  return $build;
}

สิ่งนี้ไม่ทำงานในสภาพแวดล้อมการผลิตที่เปิดใช้งานแคชและข้อมูลที่แสดงผลแสดงว่าค้าง ฉันจะปิดการใช้งานแคชสำหรับโมดูลของฉันเท่านั้นและฉันต้องทำทั้งสำหรับแม่แบบทวิกและปลั๊กอินบล็อก?

คำตอบ:


27

คุณสามารถควบคุมแคชในอาร์เรย์เรนเดอร์ด้วยองค์ประกอบ #cache

หากต้องการปิดใช้งานการเพิ่มแคช:

$build['#cache']['max-age'] = 0;

ในกรณีนี้บล็อกจะไม่ถูกแคชสำหรับผู้ใช้ที่เข้าสู่ระบบหรือผู้ใช้ที่ไม่ระบุชื่อด้วยเซสชั่น

หากคุณต้องการปิดการใช้งานแคชสำหรับผู้ใช้ที่ไม่ระบุตัวตนโดยไม่มีเซสชัน:

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

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

(แก้ไขตามความคิดเห็นของ Berdir)


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

@Berdir: ฉันใช้ max-age = 0 สำหรับผู้ใช้ที่ไม่ระบุชื่อ แต่ใช้กับเซสชัน ตอนนี้ใช้งานได้ใน dev คุณคิดว่ามันโอเคสำหรับการผลิตหรือไม่? คุณหมายถึงอะไรเมื่อปิดการใช้งานอย่างสมบูรณ์?
4k4

ไม่เป็นไรถ้าคุณมีการประชุม ปิดใช้งานด้วยการถอนการติดตั้งโมดูล page_cache อย่างสมบูรณ์หรือโดยการเปิดสวิตช์ฆ่าดูที่drupal.stackexchange.com/questions/151254/เป็นต้น
Berdir

ขอบคุณสำหรับข้อมูลที่ดีฉันได้เพิ่มสิ่งนี้ในคำตอบ
4k4

1
$ build ['# cache'] ['max-age'] = 0; ทำเคล็ดลับ !!! เบียร์ทุกรอบ! :)
โซริน

6

หากต้องการหยุดการแคชบล็อกเฉพาะให้ใช้ฟังก์ชันต่อไปนี้:

/**
 * Implements hook_preprocess_HOOK() for block.html.twig.
 */
function template-name_preprocess_block(&$vars) {
  if($vars['derivative_plugin_id'] == 'add-block-id-name') {
    //-- This stops the block being cache in drupal 8
    $vars['#cache']['max-age'] = 0;
  }
}

คำตอบที่ยอดเยี่ยม
นักเรียน

2

ปิดใช้งานแคชสำหรับหน้า / เนื้อหา / ตัวควบคุม

ปิดใช้งานแคชสำหรับเพจที่กำหนดเองจากการประกาศเส้นทาง

หากคุณต้องการปิดการใช้งานแคชสำหรับตัวควบคุมที่กำหนดเอง (โมดูลที่กำหนดเอง) คุณมี no_cacheตัวเลือก (YOUR_MODULE.routing.yml) ตัวอย่าง: ไฟล์: mymodule.routing.yml

mymodule.myroute:
  path: '/mymodule/mypage'
  defaults:
    _controller: '\Drupal\mymodule\Controller\Pages::mypage'
    _title: 'No cache page'
  requirements:
    _access: 'TRUE'
  options:
    no_cache: 'TRUE'

เพิ่มตัวเลือกเส้นทาง 'no_cache' เพื่อทำเครื่องหมายคำตอบของเส้นทางว่าไม่สามารถเข้าถึงได้


0

หากต้องการป้องกันการแคชบล็อกเฉพาะ:

เพิ่มรหัสด้านล่างในไฟล์theme_name.theme

function theme_name_preprocess_block(&$variables) {
  if ($variables['plugin_id'] == 'block_id') {
    $variables['#cache']['max-age'] = 0;
  }
}

0

หากต้องการปิดใช้งานแคชสำหรับประเภทบล็อกให้ประมวลผลบล็อกประเภทนั้นล่วงหน้าและตั้งค่า max_age เป็น 0

   /**
     * Implements hook_preprocess_HOOK() for Block document templates.
     */
    function THEMENAME_preprocess_block(array &$variables) {

      //disbale cache from spotlight
      $content = $variables['elements']['content'];
      //dump($content); //check the contents
      if (isset($content['#block_content']) && $content['#block_content'] instanceof BlockContentInterface) {

        if ($content['#block_content']->bundle() == 'BLOCK_TYPE') {
          $variables['#cache']['max-age'] = 0;
        }

      }


    }
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.