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.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을 구현해야합니다! 대체물이 아니라 추가 물입니다.
— 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.