Что такое интерфейс идентичности в Magento2


Я вижу, что многие модели в Magento 2 реализуют Magento\Framework\DataObject\IdentityInterface.
Этот интерфейс имеет один метод, называемый getIdentities
Реализации метода обычно возвращают return [self::CACHE_TAG . '_' . $this->getId()];.

Пример можно найти здесь
Для чего это используется?

Author: Raphael at Digital Pianism, 2016-04-22

3 answers

Из того, что я понял, это своего рода эквивалентность метода 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 используются в Varnish по причинам кэширования, как упоминал Маттео, для установки заголовка X-Magento-Tags.

Этот заголовок затем используется в Magento/Framework/App/PageCache/Kernel.php в методе process() для сохранения кэша:

$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);
 27
Author: Raphael at Digital Pianism, 2016-04-22 13:44:31

Судя по комментарию класса Magento\Framework\DataObject\IdentityInterface, он используется для кэширования и создания уникального идентификатора сущности, который используется в заголовках ESI в vendor/magento/module-page-cache/Controller/Block/Esi.php строке 28.

if ($blockInstance instanceof \Magento\Framework\DataObject\IdentityInterface) {
   $response->setHeader('X-Magento-Tags', implode(',', $blockInstance->getIdentities()));
}
 6
Author: Matthéo Geoffray, 2016-04-22 12:17:20

Интерфейс Identityинтерфейс заставит класс модели определить метод getIdentities(), который вернет уникальный идентификатор модели. Вы должны использовать этот интерфейс только в том случае, если вашей модели требуется обновить кэш после работы с базой данных и отобразить информацию на интерфейсной странице.

 5
Author: AlexanderPop, 2019-11-19 15:20:13