Что такое IdentityInterface в Magento2

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
Судя по комментариям класса, он используется для кэширования и создания уникального идентификатора сущности и используется в vendor/magento/module-page-cache/Controller/Block/Esi.phpстроке заголовков ESI 28
Matthéo Geoffray
@ MatthéoGeoffray да, вы правы, но getIdentitiesв этом случае метод вызывается для блочного класса, OP спрашивает о классах моделей
Рафаэль из Digital Pianism
Ах, да, хорошо, мой плохой;)
Маттео Джеффрей
@ 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методы используются в 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);
Рафаэль в цифровом пианизме
источник
5
Будьте осторожны - идентификаторы предназначены только для полного кэша страниц. Для кеша блоков вам все еще нужно реализовать cache_tags и cache_lifetime! Это дополнение, а не замена.
Роберт Эггинтон
Я хотел сохранить FPC на странице с динамическим блоком, поэтому мне пришлось реализовать getIdentities в этом блоке, но модель (в моем случае Slider) зависит также от изменений в дочерней модели (Banners), если я добавлю оба в массив identity ? или дочерняя смена означает, что нужен только родитель? спасибо @RobertEgginton
медмек
6

Судя по Magento\Framework\DataObject\IdentityInterfaceкомментарию класса, он используется для кэширования и создания уникального идентификатора объекта, который используется в заголовках ESI Varnish в 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()));
}
Маттео Джеффри
источник
1

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

AlexanderPop
источник