Magento2のIdentityInterfaceとは


20

Magento 2の多くのモデルが実装していることがわかりますMagento\Framework\DataObject\IdentityInterface
このインターフェイスには、メソッドgetIdentities
の実装が通常返される単一のメソッドがありますreturn [self::CACHE_TAG . '_' . $this->getId()];

例はここにあります
これは何のために使われますか?


それが使用されているかどうかはわかりませんが、クラスはdev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_classes.phpファイルに存在するため、後で削除することを意図している可能性があります。
マテオジェオフレイ

2
クラスのコメントから判断するには、キャッシュに使用され、ユニークなエンティティIDを作成し、ESIヘッダーで使用されているvendor/magento/module-page-cache/Controller/Block/Esi.phpライン28
MatthéoGeoffray

@MatthéoGeoffrayはいあなたは正しいが、getIdentitiesこの方法は、この場合、ブロッククラスで呼び出され、OPはモデルクラスについて尋ねている
デジタルPianismでラファエル

そうそう私の悪い;)
マテオジェフロ16

@matthéoGeoffray。あなたは正しいと思います。コメントを回答として入力することをお勧めします。
マリウス

回答:


24

私が理解したことから、これは一種getCacheTagsのMagento 1の方法と同等です。

getIdentitiesモデルクラスからは、このモデルを参照するすべてのブロックのクラスで使用されています。

わかりました/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;
}

このメソッドは、次に参照され/Magento/Catalog/Block/Category/View.phpます:

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

M2ではgetIdentities、モデルレベルのメソッドでキャッシュタグを宣言する必要があり、それらのモデルを参照するブロックでそれを使用できます。

getIdentitiesメソッドを実装するすべてのブロックをチェックすると、それらはすべて対応するモデルgetIdentitiesメソッドまたは対応するモデルキャッシュタグを参照します。\Magento\Catalog\Model\Product::CACHE_TAG

その後、これらのブロックgetIdentitiesメソッドは、X-Magento-Tagsヘッダーを設定するためにMatthéoが述べたように、キャッシュの理由でVarnishで使用されます。

このヘッダは、その後に使用されているMagento/Framework/App/PageCache/Kernel.phpprocess()キャッシュを保存する方法:

$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
注意してください-アイデンティティはページキャッシュ全体のためのものです。ブロックキャッシュについては、cache_tagsとcache_lifetimeを実装する必要があります!それは追加であり、交換ではありません。
ロバートエギントン

動的ブロックを含むページにFPCを保持したかったので、ブロックにgetIdentitiesを実装する必要がありましたが、モデル(私の場合はスライダー)は子モデル(バナー)の変更にも依存します。 ?または子の変更は、親のみが必要であることを意味しますか?ありがとう@RobertEgginton
medmek

6

クラスのMagento\Framework\DataObject\IdentityInterfaceコメントから判断すると、キャッシュに使用され、vendor/magento/module-page-cache/Controller/Block/Esi.php行28のVarnish ESIヘッダーで使用される一意のエンティティIDを作成します。

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

1

IdentityInterfaceは、Modelクラスに、モデルの一意のIDを返すgetIdentities()メソッドを強制的に定義させます。モデルがデータベース操作後にキャッシュの更新を必要とし、フロントエンドページに情報を表示する場合にのみ、このインターフェイスを使用する必要があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.