¿Qué es IdentityInterface en Magento2?

20

Veo que muchos de los modelos en Magento 2 se implementan Magento\Framework\DataObject\IdentityInterface.
Esta interfaz tiene un único método llamado getIdentities
Las implementaciones del método generalmente regresan return [self::CACHE_TAG . '_' . $this->getId()];.

Un ejemplo se puede encontrar aquí
¿Para qué se usa esto?

Marius
fuente
Realmente no sé si eso se usa, pero la clase está presente en el dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_classes.phparchivo, por lo que tal vez esté destinada a eliminarse más adelante.
Matthéo Geoffray
2
A juzgar por el comentario de la clase, se usa para caché y vendor/magento/module-page-cache/Controller/Block/Esi.php
crea
@ MatthéoGeoffray sí, tienes razón, pero el getIdentitiesmétodo se llama en una clase de bloque en este caso, el OP pregunta por las clases de modelos
Raphael en Digital Pianism
Oh, sí, mi mal;)
Matthéo Geoffray
@ MatthéoGeoffray. Creo que tienes razón. Es posible que desee poner su comentario como respuesta.
Marius

Respuestas:

24

Por lo que entendí, esto es una especie de equivalencia del getCacheTagsmétodo de Magento 1.

Las getIdentitiesclases de modelo from se utilizan en cada clase de bloque que hace referencia a este modelo.

Ok, tomemos /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 se hace referencia en /Magento/Catalog/Block/Category/View.php:

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

En M2, ahora debe declarar la etiqueta de caché con el getIdentitiesmétodo a nivel de modelo, luego puede usarla en bloques que hagan referencia a esos modelos.

Si marca cada bloque que implementa el getIdentitiesmétodo, todos hacen referencia a un getIdentitiesmétodo de modelo correspondiente o una etiqueta de caché de modelo correspondiente, como\Magento\Catalog\Model\Product::CACHE_TAG

Luego, esos getIdentitiesmétodos de bloque se utilizan en Varnish por razones de almacenamiento en caché como lo menciona Matthéo para establecer el X-Magento-Tagsencabezado.

Este encabezado se usa Magento/Framework/App/PageCache/Kernel.phpen el process()método para guardar el caché:

$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 en Digital Pianism
fuente
55
Tenga cuidado: las identidades son solo para el caché de la página completa. ¡Para el caché de bloque todavía necesita implementar cache_tags y cache_lifetime! Es una adición, no un reemplazo.
Robert Egginton
Quería mantener FPC en una página con un bloque dinámico, así que tuve que implementar getIdentities en el bloque, pero el modelo (Control deslizante en mi caso) también depende de los cambios en el Modelo secundario (Banners), si agrego ambos en la matriz de identidades ? o el cambio de niño significa que solo se necesita el padre? gracias @RobertEgginton
medmek
6

A juzgar por el Magento\Framework\DataObject\IdentityInterfacecomentario de la clase , se usa para la memoria caché y crea una ID de entidad única que se usa en los encabezados Varnish ESI en la vendor/magento/module-page-cache/Controller/Block/Esi.phplínea 28.

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

IdentityInterface obligará a la clase Model a definir el método getIdentities () que devolverá una identificación única para el modelo. Solo debe usar esta interfaz si su modelo requirió una actualización de caché después de la operación de la base de datos y mostrar información en la página de la interfaz.

AlexanderPop
fuente