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?


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);

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()));
}

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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.