Що таке 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рядка 28 ESI
Matthéo Geoffray

@ MatthéoGeoffray так, ти маєш рацію, але getIdentitiesметод викликається в блоковому класі, в цьому випадку ОП запитує про класи моделей
Рафаель в 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 з причин кешування, як згадував Matthéo для встановлення 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 у моєму випадку) також залежить від змін у дочірній моделі (Банери), чи слід додати обидва у масиві ідентифікацій ? чи зміна дитини означає, що потрібен лише батько? дякую @RobertEgginton
medmek

6

Судячи з Magento\Framework\DataObject\IdentityInterfaceкоментаря до класу, він використовується для кешу і створює унікальний ідентифікатор об'єкта, який використовується у заголовках Varnish 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()));
}

1

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.