การนำแท็กแคชที่กำหนดเองไปใช้


14

ฉันต้องการใช้ Cache Tagging ใหม่ใน D8 เพื่อช่วยให้เนื้อหาที่เกี่ยวข้องประเภทต่าง ๆ (เอนทิตี, โหนด, บล็อก, ฯลฯ ) ซิงค์กัน แต่จากการอ่านเอกสารที่มีอยู่ในปัจจุบันของคุณสมบัตินี้ฉันไม่เข้าใจวิธีการเพิ่มแท็กแคชของตัวเองไปยังรายการเนื้อหาเมื่อสร้าง / อัปเดตรายการดังกล่าว

ตัวอย่างเช่นเมื่อสร้างโหนดใหม่ของร้านค้าประเภทฉันต้องการเพิ่มตำแหน่งแท็กแคช: new_york_123 และเหมือนกันสำหรับบล็อก aa ถ้าฉันเปลี่ยนชื่อที่แสดงของตำแหน่งนิวยอร์ก 123 เป็นโซโหฉันสามารถทำให้แท็กแคชใช้ไม่ได้และมีการอัปเดตเนื้อหาที่เกี่ยวข้องทั้งหมด


1
เอนทิตีทั้งหมดมีแท็กแคช (เช่นโหนด: 123) ที่ไม่ถูกต้องโดยอัตโนมัติ ดังนั้นหากคุณเพียงแค่สร้าง / อัปเดตและแสดงโหนดคุณไม่ควรทำอะไรเลยมันควรจะทำงานได้
Berdir

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

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

ผู้ใช้แท็กแคช: {ID} อาจไม่ถูกต้องเพื่อให้แคชชัดเจนสำหรับเนื้อหาทั้งหมดที่เกี่ยวข้องกับผู้ใช้นั้น แนวคิดเดียวกัน แต่มีแท็กแคชที่กำหนดเอง
LittleCoding

คำตอบ:


13

นี่คือวิธีใช้แท็กแคชในบริบทของบล็อกที่กำหนดเองซึ่งฉันได้ลองและใช้งานได้ แต่ฉันคิดว่ามันใช้กับบริบทอื่น ๆ

ใช้แท็ก drupal เริ่มต้น

ในอาร์เรย์บิลด์คุณสามารถระบุcache > tags > node_listและเนื้อหาบล็อกนี้จะได้รับการทำให้ใช้งานไม่ได้ (รีเฟรช) เมื่อใดก็ตามที่ NODE ถูกเปลี่ยนโดยไม่ต้องทำอะไรเลยในส่วนของคุณ

public function build() {
    return array(
        '#markup' => MY_MODULE_awesome_dynamic_node_content(),
        '#cache' => [
            'tags' => ['node_list'], //invalidate when any node updates
            //'tags' => ['node:1','term:2'], //invalidate when node 1 or term 2 updates
        ],
    );
}

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

ใช้แท็กของคุณเอง

หากคุณต้องการมีวิธีการล้างอาร์เรย์สำหรับสร้างของคุณเองเพิ่มแท็กที่ไม่ซ้ำกันที่กำหนดเองใน build อาร์เรย์ (สตริงที่ไม่ซ้ำกันจะทำ)

public function build() {
    return array(
        '#markup' => MY_MODULE_awesome_dynamic_node_content(),
        '#cache' => [
            'tags' => ['MY_CUSTOM_UNIQUE_TAG'],
        ],
    );
}

และในการโทรตรรกะรหัสที่กำหนดเองinvalidateTagsของคุณด้วยแท็กของคุณเอง

function MY_MODULE_custom_clear_cache_logic(){ 
    ...
    \Drupal\Core\Cache\Cache::invalidateTags(array('MY_CUSTOM_UNIQUE_TAG'));        

ถ้าคุณต้องการอ่านเพิ่มเติมเกี่ยวกับdrupal 8 cache internals


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