Co to jest IdentityInterface w Magento2

20

Widzę, że wiele modeli w Magento 2 implementuje Magento\Framework\DataObject\IdentityInterface.
Ten interfejs ma jedną metodę o nazwie getIdentities
Implementacje metody zwykle zwracają return [self::CACHE_TAG . '_' . $this->getId()];.

Przykład można znaleźć tutaj Do
czego to służy?

Marius
źródło
Naprawdę nie wiem, czy to jest używane, ale klasa jest obecna w dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_classes.phppliku, więc może planuje się go później usunąć.
Matthéo Geoffray
2
Sądząc po komentarzu klasy, jest on używany do buforowania i tworzy unikalny identyfikator encji oraz jest używany w nagłówkach ESI vendor/magento/module-page-cache/Controller/Block/Esi.phpwiersz 28
Matthéo Geoffray
@ MatthéoGeoffray tak masz rację, ale getIdentitiesw tym przypadku metoda jest wywoływana w klasie blokowej, OP pyta o klasy modeli
Raphael w Digital Pianism
O tak, prawda, mój zły;)
Matthéo Geoffray
@ MatthéoGeoffray. Myślę, że masz rację. Możesz podać swój komentarz jako odpowiedź.
Marius

Odpowiedzi:

24

Z tego co zrozumiałem, jest to rodzaj równoważności getCacheTagsmetody Magento 1.

getIdentitiesZ klas modelu jest następnie wykorzystywana w każdej klasie bloku odsyłania tego modelu.

Ok, weźmy /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;
}

Ta metoda jest następnie przywoływana w /Magento/Catalog/Block/Category/View.php:

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

W M2 musisz teraz zadeklarować znacznik pamięci podręcznej za pomocą getIdentitiesmetody na poziomie modelu, a następnie możesz go użyć w blokach odwołujących się do tych modeli.

Jeśli zaznaczysz każdy blok implementujący getIdentitiesmetodę, wszystkie odnoszą się do odpowiedniej getIdentitiesmetody modelu lub odpowiedniego znacznika pamięci podręcznej modelu, takiego jak\Magento\Catalog\Model\Product::CACHE_TAG

Następnie te getIdentitiesmetody blokowania są używane w Varnish z powodów buforowania, jak wspomniano przez Matthéo, aby ustawić X-Magento-Tagsnagłówek.

Nagłówek ten jest następnie wykorzystywany w Magento/Framework/App/PageCache/Kernel.phpw process()sposób, aby zapisać w pamięci podręcznej:

$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 at Digital Pianism
źródło
5
Bądź ostrożny - tożsamości służą tylko do pełnego buforowania strony. W przypadku pamięci podręcznej bloków musisz jeszcze wdrożyć cache_tags i cache_lifetime! To dodatek, a nie zamiennik.
Robert Egginton
Chciałem zatrzymać FPC na stronie z blokiem dynamicznym, więc musiałem zaimplementować getIdentities w tym bloku, ale model (w moim przypadku Slider) zależy również od zmian w modelu potomnym (banery), czy powinienem dodać oba w tablicy tożsamości ? czy zmiana dziecka oznacza, że ​​potrzebny jest tylko rodzic? dziękuję @RobertEgginton
medmek
6

Sądząc po Magento\Framework\DataObject\IdentityInterfacekomentarzu klasy , jest on używany do buforowania i tworzy unikalny identyfikator encji, który jest używany w nagłówkach Varnish ESI w vendor/magento/module-page-cache/Controller/Block/Esi.phpwierszu 28.

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

IdentityInterface zmusi klasę Model do zdefiniowania metody getIdentities (), która zwróci unikalny identyfikator modelu. Tego interfejsu można użyć tylko wtedy, gdy model wymagał odświeżenia pamięci podręcznej po operacji bazy danych i renderowania informacji na stronie interfejsu użytkownika.

AlexanderPop
źródło