Was ist IdentityInterface in Magento2?


20

Ich sehe, dass viele Modelle in Magento 2 implementiert sind Magento\Framework\DataObject\IdentityInterface.
Diese Schnittstelle hat eine einzige Methode namens getIdentities
Die Implementierungen der Methode geben normalerweise zurück return [self::CACHE_TAG . '_' . $this->getId()];.

Ein Beispiel finden Sie hier
Wozu dient das?


Ich weiß nicht wirklich, ob das verwendet wird, aber die Klasse ist in der dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_classes.phpDatei vorhanden, sodass sie möglicherweise später entfernt werden soll.
Matthéo Geoffray

2
Dem Klassenkommentar nach zu urteilen, wird es für den Cache verwendet, um eine eindeutige Entitäts-ID zu vendor/magento/module-page-cache/Controller/Block/Esi.php
erstellen

@ MatthéoGeoffray ja du hast recht, aber die getIdentitiesMethode wird für eine Blockklasse in diesem Fall aufgerufen, das OP fragt nach den
Modellklassen

Oh ja, stimmt, mein Schlechtes;)
Matthéo Geoffray

@ MatthéoGeoffray. Ich glaube, Du hast recht. Vielleicht möchten Sie Ihren Kommentar als Antwort einfügen.
Marius

Antworten:


24

Nach meinem Verständnis ist dies eine Art Äquivalenz der getCacheTagsMethode von Magento 1.

Die getIdentitiesfrom-Modellklassen werden dann in jeder Blockklasse verwendet, die auf dieses Modell verweist.

Ok, nehmen wir die /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;
}

Auf diese Methode wird dann verwiesen in /Magento/Catalog/Block/Category/View.php:

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

In M2 müssen Sie jetzt das Cache-Tag mit der getIdentitiesMethode auf Modellebene deklarieren. Anschließend können Sie es in Blöcken verwenden, die auf diese Modelle verweisen.

Wenn Sie jeden Block überprüfen, der die getIdentitiesMethode implementiert , verweisen alle auf eine entsprechende Modellmethode getIdentitiesoder ein entsprechendes Modell-Cache-Tag wie z\Magento\Catalog\Model\Product::CACHE_TAG

Dann werden diese getIdentitiesBlockmethoden in Varnish aus Caching-Gründen verwendet, wie von Matthéo erwähnt, um den X-Magento-TagsHeader zu setzen .

Dieser Header wird dann Magento/Framework/App/PageCache/Kernel.phpin der process()Methode verwendet, um den Cache zu speichern:

$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
Seien Sie vorsichtig - Identitäten gelten nur für den gesamten Seiten-Cache. Für den Blockcache müssen Sie noch cache_tags und cache_lifetime implementieren! Es ist eine Ergänzung, kein Ersatz.
Robert Egginton

Ich wollte FPC in einer Seite mit einem dynamischen Block halten, also musste ich getIdentities im Block implementieren, aber das Modell (in meinem Fall Slider) hängt auch von Änderungen im untergeordneten Modell (Banners) ab, sollte ich beide in das Identities-Array aufnehmen ? oder bedeutet der Kinderwechsel, dass nur die Eltern gebraucht werden? danke @RobertEgginton
medmek

6

Gemessen am Klassenkommentar Magento\Framework\DataObject\IdentityInterfacewird er für den Cache verwendet und erstellt eine eindeutige Entitäts-ID, die in den Varnish ESI-Headern in vendor/magento/module-page-cache/Controller/Block/Esi.phpZeile 28 verwendet wird.

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

1

Das IdentityInterface erzwingt, dass die Model-Klasse die Methode getIdentities () definiert, die eine eindeutige ID für das Modell zurückgibt. Sie dürfen diese Schnittstelle nur verwenden, wenn für Ihr Modell nach dem Datenbankbetrieb eine Cache-Aktualisierung erforderlich ist und Informationen auf der Front-End-Seite angezeigt werden.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.