什么是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文件中,因此可能打算稍后删除。
MatthéoGeoffray

2
由类评论来看它是用于高速缓存,并作出独特的实体ID和ESI头用vendor/magento/module-page-cache/Controller/Block/Esi.php线28
MatthéoGeoffray

@MatthéoGeoffray是的,您是对的,但是getIdentities在这种情况下,该方法在块类上调用,OP正在询问模型类
Digital Pianism的Raphael,2016年

哦,是的,我不好;)
MatthéoGeoffray 16年

@MatthéoGeoffray。我想你是对的。您可能希望将您的评论作为答案。
Marius

Answers:


24

据我了解,这相当于getCacheTagsMagento 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,由于Matthéo提到的缓存原因,在Varnish中使用了这些块方法来设置X-Magento-Tags标头。

然后,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,但是模型(在我的情况下为Slider)还取决于子模型(Banners)的更改,是否我应该在identities数组中添加两者?还是换孩子意味着只需要父母?谢谢@RobertEgginton
medmek

6

根据类Magento\Framework\DataObject\IdentityInterface注释判断,它用于缓存并生成唯一的实体ID,该ID在vendor/magento/module-page-cache/Controller/Block/Esi.php第28行的Varnish ESI标头中使用。

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

1

IdentityInterface将强制Model类定义getIdentities()方法,该方法将返回模型的唯一ID。仅当模型需要在数据库操作后刷新高速缓存并将信息呈现到前端页面时,才必须使用此接口。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.