Cos'è IdentityInterface in Magento2


20

Vedo che molti dei modelli in Magento 2 implementano Magento\Framework\DataObject\IdentityInterface.
Questa interfaccia ha un solo metodo chiamato getIdentities
Le implementazioni del metodo di solito restituiscono return [self::CACHE_TAG . '_' . $this->getId()];.

Un esempio può essere trovato qui A
cosa serve questo?


Non so davvero se viene utilizzato, ma la classe è presente nel dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_classes.phpfile, quindi forse dovrebbe essere rimossa in seguito.
Matthéo Geoffray,

2
A giudicare dal commento della classe, viene utilizzato per la cache e crea un ID entità univoco e utilizzato nelle intestazioni ESI vendor/magento/module-page-cache/Controller/Block/Esi.phplinea 28
Matthéo Geoffray,

@ MatthéoGeoffray sì, hai ragione, ma getIdentitiesin questo caso il metodo viene chiamato in una classe a blocchi, l'OP chiede informazioni sulle classi dei modelli
Raffaello al Pianismo digitale,

Oh sì, giusto, mio ​​male;)
Matthéo Geoffray,

@ MatthéoGeoffray. Penso che tu abbia ragione. Potresti voler inserire il tuo commento come risposta.
Marius

Risposte:


24

Da quello che ho capito, questo è un po 'l'equivalenza del getCacheTagsmetodo di Magento 1.

Le getIdentitiesclassi del modello from vengono quindi utilizzate in ogni classe di blocco che fa riferimento a questo modello.

Ok prendiamo il /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;
}

Questo metodo viene quindi indicato in /Magento/Catalog/Block/Category/View.php:

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

In M2, ora devi dichiarare il tag cache con il getIdentitiesmetodo a livello di modello, quindi puoi usarlo in blocchi che fanno riferimento a quei modelli.

Se si controlla ogni blocco che implementa il getIdentitiesmetodo, fanno tutti riferimento a un getIdentitiesmetodo modello corrispondente o un tag cache modello corrispondente come\Magento\Catalog\Model\Product::CACHE_TAG

Quindi quei getIdentitiesmetodi di blocco sono usati in Varnish per motivi di cache come menzionato da Matthéo per impostare l' X-Magento-Tagsintestazione.

Questa intestazione viene quindi utilizzato in Magento/Framework/App/PageCache/Kernel.phpnel process()metodo per salvare la 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
Fai attenzione: le identità sono solo per la cache della pagina intera. Per la cache a blocchi è ancora necessario implementare cache_tags e cache_lifetime! È un'aggiunta, non una sostituzione.
Robert Egginton,

Volevo mantenere l'FPC in una pagina con un blocco dinamico, quindi ho dovuto implementare getIdentities nel blocco, ma il modello (nel mio caso Slider) dipende anche dalle modifiche nel Modello figlio (Banner), dovrei aggiungere entrambi nella matrice delle identità ? o il cambio figlio significa che è necessario solo il genitore? grazie @RobertEgginton
medmek

6

A giudicare dal Magento\Framework\DataObject\IdentityInterfacecommento della classe , viene utilizzato per la cache e crea un ID entità univoco utilizzato nelle intestazioni ESI di Varnish nella vendor/magento/module-page-cache/Controller/Block/Esi.phpriga 28.

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

1

IdentityInterface imporrà alla classe Model di definire il metodo getIdentities () che restituirà un ID univoco per il modello. È necessario utilizzare questa interfaccia solo se il modello ha richiesto l'aggiornamento della cache dopo l'operazione del database e il rendering delle informazioni sulla pagina di frontend.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.