IdentityInterface ใน Magento2 คืออะไร


20

ฉันเห็นว่ามีโมเดลมากมายใน Magento 2 ที่ใช้งานMagento\Framework\DataObject\IdentityInterfaceได้
อินเตอร์เฟซนี้มีวิธีเดียวที่เรียกว่าการใช้งานของวิธีการที่มักจะกลับมาgetIdentities
return [self::CACHE_TAG . '_' . $this->getId()];

ตัวอย่างสามารถพบได้ที่นี่
สิ่งนี้ใช้ทำอะไร?


ฉันไม่รู้จริงๆว่ามันถูกใช้หรือไม่ แต่มีคลาสอยู่ในdev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_classes.phpไฟล์ดังนั้นอาจมีวัตถุประสงค์เพื่อลบในภายหลัง
Matthéo Geoffray

2
ตัดสินโดยความคิดเห็นระดับนั้นใช้สำหรับแคชและสร้างรหัสเอนทิตีที่ไม่ซ้ำกันและใช้ในส่วนหัวของ ESI vendor/magento/module-page-cache/Controller/Block/Esi.phpบรรทัดที่ 28
Matthéo Geoffray

@ MatthéoGeoffrayใช่คุณพูดถูก แต่getIdentitiesวิธีการนั้นถูกเรียกใช้ในคลาสบล็อกในกรณีนี้ OP กำลังถามเกี่ยวกับคลาสของโมเดล
Raphael at Digital Pianism

โอ้ใช่ถูกต้องไม่ดีของฉัน;)
Matthéo Geoffray

@ MatthéoGeoffray ฉันคิดว่าคุณถูก. คุณอาจต้องการแสดงความคิดเห็นเป็นคำตอบ
Marius

คำตอบ:


24

จากสิ่งที่ฉันเข้าใจนี่คือความเท่าเทียมกันของgetCacheTagsวิธีการของวีโอไอพี 1

getIdentitiesจากชั้นเรียนรุ่นที่ใช้แล้วในชั้นเรียนทุกบล็อคอ้างอิงแบบนี้

ตกลงมาทำสิ่งต่อไปนี้/Magento/Catalog/Model/Category.php:

public function getIdentities()
{
    $identities = [
        self::CACHE_TAG . '_' . $this->getId(),
    ];
    if ($this->hasDataChanges() || $this->isDeleted()) {
        $identities[] = Product::CACHE_PRODUCT_CATEGORY_TAG . '_' . $this->getId();
    }
    return $identities;
}

วิธีการนี้จะอ้างอิงใน/Magento/Catalog/Block/Category/View.php:

public function getIdentities()
{
    return $this->getCurrentCategory()->getIdentities();
}

ใน M2 ตอนนี้คุณต้องประกาศแคชแท็กด้วยgetIdentitiesวิธีการที่ระดับรูปแบบจากนั้นคุณสามารถใช้มันในบล็อกอ้างอิงรุ่นเหล่านั้น

หากคุณตรวจสอบทุกบล็อกที่ใช้getIdentitiesวิธีการพวกเขาทั้งหมดอ้างอิงgetIdentitiesวิธีการโมเดลที่สอดคล้องกันหรือแท็กแคชโมเดลที่สอดคล้องกันเช่น\Magento\Catalog\Model\Product::CACHE_TAG

จากนั้นใช้getIdentitiesวิธีการบล็อกเหล่านั้นในวานิชสำหรับเหตุผลการแคชตามที่Matthéoระบุไว้เพื่อตั้งค่าX-Magento-Tagsส่วนหัว

หัวข้อนี้ถูกนำมาใช้แล้วMagento/Framework/App/PageCache/Kernel.phpในprocess()วิธีการที่จะบันทึกแคช:

$tagsHeader = $response->getHeader('X-Magento-Tags');
$tags = $tagsHeader ? explode(',', $tagsHeader->getFieldValue()) : [];

$response->clearHeader('Set-Cookie');
$response->clearHeader('X-Magento-Tags');
if (!headers_sent()) {
    header_remove('Set-Cookie');
}
$this->cache->save(serialize($response), $this->identifier->getValue(), $tags, $maxAge);

5
โปรดระวัง - ข้อมูลประจำตัวใช้สำหรับแคชแบบเต็มหน้า สำหรับแคชบล็อกคุณยังต้องใช้ cache_tags และ cache_lifetime! มันเป็นการเพิ่มเติมไม่ใช่การทดแทน
Robert Egginton

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

6

ตัดสินโดยMagento\Framework\DataObject\IdentityInterfaceความคิดเห็นของคลาสที่ใช้สำหรับแคชและสร้างเอนทิตี ID เฉพาะที่ใช้ในวานิช ESI ส่วนหัวในvendor/magento/module-page-cache/Controller/Block/Esi.phpบรรทัดที่ 28

if ($blockInstance instanceof \Magento\Framework\DataObject\IdentityInterface) {
   $response->setHeader('X-Magento-Tags', implode(',', $blockInstance->getIdentities()));
}

1

IdentityInterface จะบังคับคลาส Model เพื่อกำหนดเมธอด getIdentities () ซึ่งจะส่งคืน id เฉพาะสำหรับโมเดล คุณต้องใช้อินเทอร์เฟซนี้เฉพาะเมื่อโมเดลของคุณต้องการการรีเฟรชแคชหลังจากการดำเนินการฐานข้อมูลและแสดงข้อมูลไปยังหน้าส่วนหน้า

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