사용자 정의 캐시 태그 구현


14

D8의 새로운 캐시 태깅을 사용하여 다양한 유형 (엔티티, 노드, 블록 등)의 관련 콘텐츠를 동기화 할 수 있습니다. 그러나이 기능의 현재 사용 가능한 문서를 읽음으로써 해당 항목을 만들거나 업데이트 할 때 콘텐츠 항목에 캐시 태그를 추가하는 방법을 이해하지 못합니다.

예를 들어 Store 유형의 새 노드를 만들 때 캐시 태그 location : new_york_123을 추가하고 블록에 동일하게 추가하고 싶습니다. 그런 다음 New York 123 위치의 표시 이름을 SoHo로 변경하면 캐시 태그를 무효화하고 모든 관련 컨텐츠를 업데이트 할 수 있습니다.


1
모든 엔티티에는 이미 자동으로 무효화 된 캐시 태그 (예 : node : 123)가 있습니다. 따라서 노드를 생성 / 업데이트하고 표시하는 경우 아무 것도 할 필요가 없으며 작동해야합니다.
Berdir

작성 / 업데이트 할 때 모든 관련 유형의 컨텐츠 (노드, 블록, 엔티티)를 찾은 다음 각 캐시 테이블에서이를 지우려면 쿼리가 필요합니다. 단일 사용자 정의 캐시 태그를 사용하여 컨텐츠 항목의 관계를 식별하는 경우 해당 관련 항목의 캐시를 지우려면 해당 태그 만 무효화해야합니다.
LittleCoding

나는 당신의 의미와 구조가 무엇인지 이해하지 못합니다. 태그는 사용될 때 추가됩니다. 캐시 태그는 해당 노드 / 물체가 변경 될 경우 변경해야하는 경우 블록과 같은 렌더 요소에 추가되어야합니다. 표준 메커니즘을 사용하여 엔터티를 표시하는 경우 이미 해당 될 수 있습니다. 작동하지 않으면 코드로 정확히 무엇을하고 있는지 더 자세히 공유해야합니다.
Berdir

캐시 태그 사용자 : {ID}를 무효화하여 해당 사용자와 관련된 모든 컨텐츠에 대해 캐시 지우기를 트리거 할 수 있습니다. 동일한 아이디어이지만 사용자 정의 캐시 태그가 있습니다.
LittleCoding

답변:


13

다음은 시도하고 작동하는 사용자 정의 블록의 컨텍스트에서 캐시 태그를 사용하는 방법이지만 다른 컨텍스트에도 적용됩니다.

기본 드루팔 태그 사용

빌드 배열에서 지정 cache > tags > node_list할 수 있으며이 블록 콘텐츠는 사용자가 수행 할 다른 작업이 없으면 NODE가 변경되면 무효화 (새로 고침)됩니다

public function build() {
    return array(
        '#markup' => MY_MODULE_awesome_dynamic_node_content(),
        '#cache' => [
            'tags' => ['node_list'], //invalidate when any node updates
            //'tags' => ['node:1','term:2'], //invalidate when node 1 or term 2 updates
        ],
    );
}

또는 위의 코드 주석에 표시된 것처럼 특정 노드 또는 용어에서 배열을 무효화하기 위해 하나 이상의 노드 / 용어 / 사용자 ID를 넣을 수 있습니다. 참고 : 노드, 용어, 사용자 및 사용자 정의 태그를 적절하게 혼합하여 일치시킬 수 있습니다.

자신의 태그를 사용하십시오

빌드 배열을 지우는 고유 한 방법을 원한다면 빌드 배열에 사용자 정의 고유 태그를 추가하십시오 (유일한 문자열은 수행합니다)

public function build() {
    return array(
        '#markup' => MY_MODULE_awesome_dynamic_node_content(),
        '#cache' => [
            'tags' => ['MY_CUSTOM_UNIQUE_TAG'],
        ],
    );
}

invalidateTags자신의 태그 를 사용하여 사용자 정의 코드 논리 호출 에서

function MY_MODULE_custom_clear_cache_logic(){ 
    ...
    \Drupal\Core\Cache\Cache::invalidateTags(array('MY_CUSTOM_UNIQUE_TAG'));        

drupal 8 cache internals에 대한 자세한 내용을 보려면


2
cache_tags.invalidator클래스를 직접 참조하는 대신 서비스를 사용하는 것이 이상적이라고 생각 합니다.
Andy
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.