O que é IdentityInterface no Magento2

20

Vejo que muitos dos modelos no Magento 2 são implementados Magento\Framework\DataObject\IdentityInterface.
Essa interface possui um único método chamado getIdentities
As implementações do método geralmente retornam return [self::CACHE_TAG . '_' . $this->getId()];.

Um exemplo pode ser encontrado aqui Para
que isso é usado?

Marius
fonte
Eu realmente não sei se isso é usado, mas a classe está presente no dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_classes.phparquivo, então talvez ela deva ser removida mais tarde.
Matthéo Geoffray
2
A julgar pelo comentário de classe é usado para cache e fazer uma ID única entidade e utilizado em ESI cabeçalhos vendor/magento/module-page-cache/Controller/Block/Esi.phplinha 28
Mattheo Geoffray
@ MatthéoGeoffray sim, você está certo, mas o getIdentitiesmétodo é chamado em uma classe bloco, neste caso, o OP é perguntando sobre os modelos de aulas
Raphael em Digital pianismo
Ah, sim, certo, meu mal;)
Matthéo Geoffray
@ MatthéoGeoffray. Eu acho que você está certo. Você pode colocar seu comentário como resposta.
Marius

Respostas:

24

Pelo que entendi, esse é o tipo de equivalência do getCacheTagsmétodo do Magento 1.

As getIdentitiesclasses from model são usadas em todas as classes de bloco que fazem referência a este modelo.

Ok, vamos dar o /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;
}

Este método é referenciado em /Magento/Catalog/Block/Category/View.php:

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

No M2, agora você precisa declarar a tag de cache com o getIdentitiesmétodo no nível do modelo, para usá-la em blocos que referenciam esses modelos.

Se você verificar todos os blocos que implementam o getIdentitiesmétodo, todos eles fazem referência a um getIdentitiesmétodo de modelo correspondente ou a uma tag de cache de modelo correspondente, como\Magento\Catalog\Model\Product::CACHE_TAG

Em seguida, esses getIdentitiesmétodos de bloco são usados ​​no Varnish por razões de armazenamento em cache, como mencionado por Matthéo, para definir o X-Magento-Tagscabeçalho.

Esse cabeçalho é então usado no Magento/Framework/App/PageCache/Kernel.phpdiretórioprocess() método para salvar o 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 na Digital Pianism
fonte
5
Cuidado: as identidades são apenas para o cache da página inteira. Para o cache do bloco, você ainda precisa implementar cache_tags e cache_lifetime! É uma adição, não uma substituição.
precisa saber é o seguinte
Eu queria manter o FPC em uma página com um bloco dinâmico, então tive que implementar getIdentities no bloco, mas o modelo (Slider no meu caso) depende também de alterações no Modelo filho (Banners), devo adicionar ambos na matriz de identidades ? ou a mudança de filhos significa que apenas os pais são necessários? Obrigado @RobertEgginton
medmek 12/11
6

A julgar pelo Magento\Framework\DataObject\IdentityInterfacecomentário da classe, ele é usado para armazenar em cache e criar um ID de entidade exclusivo usado nos cabeçalhos do Varnish ESI na vendor/magento/module-page-cache/Controller/Block/Esi.phplinha 28.

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

O IdentityInterface forçará a classe Model a definir o método getIdentities () que retornará um ID exclusivo para o modelo. Você deve usar essa interface apenas se o seu modelo exigiu atualização de cache após a operação do banco de dados e renderizou informações na página de front-end.

AlexanderPop
fonte