Magento2의 IdentityInterface 란 무엇입니까


20

Magento 2의 많은 모델이 구현되는 것을 알 수 Magento\Framework\DataObject\IdentityInterface있습니다.
이 인터페이스에는 메소드 getIdentities
의 구현이 일반적으로 return 이라는 단일 메소드가 return [self::CACHE_TAG . '_' . $this->getId()];있습니다.

여기에서 예를 찾을 수 있습니다
.


실제로 사용되는지는 모르겠지만 클래스가 dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_classes.php파일에 있으므로 나중에 제거하려고합니다.
Matthéo Geoffray

2
수업 설명에 따르면 캐시에 사용되며 고유 한 엔터티 ID를 만들고 ESI 헤더 vendor/magento/module-page-cache/Controller/Block/Esi.php행 28
Matthéo Geoffray

@ MatthéoGeoffray 네 맞아요.하지만 getIdentities이 경우에는이 메소드가 블록 클래스에서 호출됩니다. OP는 모델 클래스에 대해 묻습니다
Raphael at Digital Pianism

아 맞아 내 나쁜;)
Matthéo Geoffray

@ MatthéoGeoffray. 그 쪽이 맞는 거 같아요. 귀하의 의견을 답변으로 작성하고 싶을 수도 있습니다.
Marius

답변:


24

내가 이해 한 바에 따르면, 이것은 마 getCacheTags젠토 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

그런 다음 getIdentitiesMatthéo가 언급 한 것처럼 캐시를 위해 바니시에서 이러한 블록 방법을 사용하여 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을 구현해야합니다! 대체물이 아니라 추가 물입니다.
Robert Egginton

동적 블록이있는 페이지에 FPC를 유지하고 싶었으므로 블록에서 getIdentities를 구현해야했지만 모델 (슬라이더)은 자식 모델 (배너)의 변경 사항에 따라 달라집니다. ? 또는 자녀 변경은 부모 만 필요하다는 것을 의미합니까? 감사합니다 @RobertEgginton
medmek

6

클래스 Magento\Framework\DataObject\IdentityInterface주석으로 판단하면 캐시에 사용되고 vendor/magento/module-page-cache/Controller/Block/Esi.php28 행의 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.