Danh tính là gì trong Magento2


20

Tôi thấy rằng rất nhiều mô hình trong Magento 2 thực hiện Magento\Framework\DataObject\IdentityInterface.
Giao diện này có một phương thức duy nhất gọi là getIdentities
Việc triển khai phương thức thường trả về return [self::CACHE_TAG . '_' . $this->getId()];.

Một ví dụ có thể được tìm thấy ở đây
Cái này dùng để làm gì?


Tôi thực sự không biết nếu nó được sử dụng nhưng lớp có trong dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_classes.phptệp để có thể nó sẽ bị xóa sau đó.
Matthéo Geoffray

2
Đánh giá theo nhận xét của lớp, nó được sử dụng cho bộ đệm và tạo ID thực thể duy nhất và được sử dụng trong vendor/magento/module-page-cache/Controller/Block/Esi.phpdòng tiêu đề ESI 28
Matthéo Geoffray

@ MatthéoGeoffray vâng, bạn đúng nhưng getIdentitiesphương thức được gọi trong một lớp khối trong trường hợp này, OP đang hỏi về các lớp mô hình
Raphael tại Digital Pianism

Ồ đúng rồi, xấu của tôi;)
Matthéo Geoffray

@ MatthéoGeoffray. Tôi nghĩ bạn đúng. Bạn có thể muốn đưa nhận xét của bạn như một câu trả lời.
Marius

Câu trả lời:


24

Theo những gì tôi hiểu, đây là loại tương đương với getCacheTagsphương pháp của Magento 1.

Các getIdentitieslớp mô hình sau đó được sử dụng trong mọi lớp khối tham chiếu mô hình này.

Ok, hãy lấy /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;
}

Phương pháp này sau đó được tham chiếu trong /Magento/Catalog/Block/Category/View.php:

public function getIdentities()
{
    return $this->getCurrentCategory()->getIdentities();
}

Trong M2, bây giờ bạn phải khai báo thẻ bộ đệm với getIdentitiesphương thức ở cấp mô hình, sau đó bạn có thể sử dụng nó trong các khối tham chiếu các mô hình đó.

Nếu bạn kiểm tra mọi khối thực hiện getIdentitiesphương thức, tất cả chúng đều tham chiếu một getIdentitiesphương thức mô hình tương ứng hoặc thẻ bộ đệm mô hình tương ứng, chẳng hạn như\Magento\Catalog\Model\Product::CACHE_TAG

Sau đó, các getIdentitiesphương thức chặn đó được sử dụng trong Varnish vì lý do lưu trữ như được đề cập bởi Matthéo để đặt X-Magento-Tagstiêu đề.

Tiêu đề này sau đó được sử dụng trong Magento/Framework/App/PageCache/Kernel.phptrong process()phương pháp để tiết kiệm bộ nhớ cache:

$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
Hãy cẩn thận - danh tính chỉ dành cho bộ đệm toàn bộ trang. Đối với bộ đệm khối, bạn vẫn cần triển khai cache_tags và cache_lifetime! Đó là một bổ sung, không phải là một sự thay thế.
Robert Egginton

Tôi muốn giữ FPC trong một trang với một khối động vì vậy tôi phải triển khai getIdentities trong khối, nhưng mô hình (Slider trong trường hợp của tôi) cũng phụ thuộc vào các thay đổi trong Mô hình con (Biểu ngữ), tôi có nên thêm cả hai trong mảng nhận dạng ? hoặc thay đổi con có nghĩa là chỉ cần cha mẹ là cần thiết? cảm ơn bạn @RobertEgginton
medmek

6

Đánh giá theo Magento\Framework\DataObject\IdentityInterfacenhận xét lớp, nó được sử dụng cho bộ đệm và tạo một ID thực thể duy nhất được sử dụng trong các tiêu đề ESI Varnish trong vendor/magento/module-page-cache/Controller/Block/Esi.phpdòng 28.

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

1

IdentityInterface sẽ buộc lớp Model xác định phương thức getIdentities () sẽ trả về một id duy nhất cho mô hình. Bạn chỉ phải sử dụng giao diện này nếu mô hình của bạn yêu cầu làm mới bộ đệm sau khi hoạt động cơ sở dữ liệu và hiển thị thông tin cho trang frontend.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.