Apa itu IdentityInterface di Magento2

20

Saya melihat bahwa banyak model di Magento 2 diimplementasikan Magento\Framework\DataObject\IdentityInterface.
Antarmuka ini memiliki metode tunggal yang disebut getIdentities
Implementasi metode biasanya kembali return [self::CACHE_TAG . '_' . $this->getId()];.

Contoh dapat ditemukan di sini Untuk
apa ini digunakan?

Marius
sumber
Saya tidak benar-benar tahu apakah itu digunakan tetapi kelas hadir dalam dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_classes.phpfile jadi mungkin ini dimaksudkan untuk dihapus nanti.
Matthéo Geoffray
2
Dilihat oleh komentar kelas, ini digunakan untuk cache dan membuat ID entitas yang unik dan digunakan dalam vendor/magento/module-page-cache/Controller/Block/Esi.phpbaris header ESI 28
Matthéo Geoffray
@ MatthéoGeoffray ya Anda benar tetapi getIdentitiesmetode ini disebut pada kelas blok dalam hal ini, OP bertanya tentang kelas model
Raphael di Digital Pianism
Oh ya benar,
salahku
@ MatthéoGeoffray. Saya pikir kamu benar. Anda mungkin ingin memberikan komentar sebagai jawaban.
Marius

Jawaban:

24

Dari apa yang saya mengerti, ini adalah semacam kesetaraan getCacheTagsmetode Magento 1.

Kelas getIdentitiesdari model kemudian digunakan di setiap kelas blok yang mereferensikan model ini.

Ok mari kita ambil /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;
}

Metode ini kemudian dirujuk dalam /Magento/Catalog/Block/Category/View.php:

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

Dalam M2, Anda sekarang harus mendeklarasikan tag cache dengan getIdentitiesmetode di tingkat model, maka Anda dapat menggunakannya dalam blok yang merujuk pada model-model itu.

Jika Anda memeriksa setiap blok yang menerapkan getIdentitiesmetode ini, mereka semua merujuk getIdentitiesmetode model yang sesuai atau tag cache model yang sesuai seperti\Magento\Catalog\Model\Product::CACHE_TAG

Kemudian getIdentitiesmetode blok tersebut digunakan dalam Varnish untuk alasan caching seperti yang disebutkan oleh Matthéo untuk mengatur X-Magento-Tagsheader.

Header ini kemudian digunakan di Magento/Framework/App/PageCache/Kernel.phpdalam process()metode untuk menyimpan cache:

$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);
Raphael di Digital Pianism
sumber
5
Hati-hati - identitas hanya untuk cache halaman penuh. Untuk memblokir cache, Anda masih perlu mengimplementasikan cache_tags dan cache_lifetime! Ini tambahan, bukan pengganti.
Robert Egginton
Saya ingin menyimpan FPC di halaman dengan blok dinamis jadi saya harus menerapkan getIdentities di blok, tetapi model (Slider dalam kasus saya) tergantung juga pada perubahan dalam Model anak (Spanduk), haruskah saya menambahkan keduanya dalam array identitas ? atau perubahan anak berarti hanya orang tua yang diperlukan? terima kasih @RobertEgginton
medmek
6

Dilihat oleh Magento\Framework\DataObject\IdentityInterfacekomentar kelas itu digunakan untuk cache dan membuat ID entitas unik yang digunakan dalam header Varnish ESI di vendor/magento/module-page-cache/Controller/Block/Esi.phpbaris 28.

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

IdentityInterface akan memaksa kelas Model untuk mendefinisikan metode getIdentities () yang akan mengembalikan id unik untuk model. Anda hanya harus menggunakan antarmuka ini jika model Anda memerlukan penyegaran cache setelah operasi basis data dan memberikan informasi ke halaman frontend.

AlexanderPop
sumber