Qu'est-ce que IdentityInterface dans Magento2

20

Je vois que beaucoup de modèles de Magento 2 sont mis en œuvre Magento\Framework\DataObject\IdentityInterface.
Cette interface a une seule méthode appelée getIdentities
Les implémentations de la méthode retournent généralement return [self::CACHE_TAG . '_' . $this->getId()];.

Un exemple peut être trouvé ici A
quoi cela sert-il?

Marius
la source
Je ne sais pas vraiment si cela est utilisé mais la classe est présente dans le dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_classes.phpfichier donc peut-être qu'elle est destinée à être supprimée plus tard.
Matthéo Geoffray
2
A en juger par le commentaire de la classe, il est utilisé pour le cache et créer un identifiant d'entité unique et utilisé dans les en-têtes ESI vendor/magento/module-page-cache/Controller/Block/Esi.phpligne 28
Matthéo Geoffray
@ MatthéoGeoffray oui vous avez raison mais la getIdentitiesméthode est appelée sur une classe de bloc dans ce cas, l'OP pose des questions sur les classes de modèles
Raphael au Digital Pianism
Oh oui c'est vrai mon mal;)
Matthéo Geoffray
@ MatthéoGeoffray. Je pense que tu as raison. Vous voudrez peut-être mettre votre commentaire comme réponse.
Marius

Réponses:

24

D'après ce que j'ai compris, c'est une sorte d'équivalence de la getCacheTagsméthode de Magento 1.

Les getIdentitiesclasses from model sont ensuite utilisées dans chaque classe de bloc référençant ce modèle.

Ok, prenons le /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;
}

Cette méthode est ensuite référencée dans /Magento/Catalog/Block/Category/View.php:

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

Dans M2, vous devez maintenant déclarer la balise de cache avec la getIdentitiesméthode au niveau du modèle, puis vous pouvez l'utiliser dans des blocs référençant ces modèles.

Si vous vérifiez chaque bloc implémentant la getIdentitiesméthode, ils font tous référence à une getIdentitiesméthode de modèle correspondante ou à une balise de cache de modèle correspondante telle que\Magento\Catalog\Model\Product::CACHE_TAG

Ensuite, ces getIdentitiesméthodes de blocage sont utilisées dans Varnish pour des raisons de mise en cache comme mentionné par Matthéo pour définir l'en- X-Magento-Tagstête.

Cet en-tête est ensuite utilisé dans Magento/Framework/App/PageCache/Kernel.phpla process()méthode pour enregistrer le 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 chez Digital Pianism
la source
5
Soyez prudent - les identités sont juste pour le cache de page complète. Pour le cache de blocs, vous devez toujours implémenter cache_tags et cache_lifetime! C'est un ajout, pas un remplacement.
Robert Egginton
Je voulais garder FPC dans une page avec un bloc dynamique, j'ai donc dû implémenter getIdentities dans le bloc, mais le modèle (Slider dans mon cas) dépend également des changements dans le modèle enfant (bannières), dois-je ajouter les deux dans le tableau des identités ? ou le changement d'enfant signifie que seul le parent est nécessaire? merci @RobertEgginton
medmek
6

A en juger par le Magento\Framework\DataObject\IdentityInterfacecommentaire de classe, il est utilisé pour le cache et crée un ID d'entité unique qui est utilisé dans les en-têtes ESI Varnish à la vendor/magento/module-page-cache/Controller/Block/Esi.phpligne 28.

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

IdentityInterface forcera la classe Model à définir la méthode getIdentities () qui renverra un identifiant unique pour le modèle. Vous ne devez utiliser cette interface que si votre modèle nécessite une actualisation du cache après l'opération de la base de données et le rendu des informations sur la page frontend.

AlexanderPop
la source