Implementowanie niestandardowych tagów pamięci podręcznej

14

Chciałbym użyć nowego tagowania pamięci podręcznej w D8, aby zsynchronizować powiązane treści różnych typów (encje, węzły, bloki itp.). Ale po przeczytaniu obecnie dostępnej dokumentacji tej funkcji nie rozumiem, jak dodać własny znacznik pamięci podręcznej do elementów treści podczas tworzenia / aktualizowania tych elementów.

Na przykład podczas tworzenia nowego węzła typu Store chciałbym dodać lokalizację znacznika pamięci podręcznej: nowy_kork_123 i to samo dla bloku. Następnie, jeśli zmieniłem nazwę wyświetlaną lokalizacji New York 123 na SoHo, mógłbym unieważnić tag pamięci podręcznej i zaktualizować wszystkie powiązane treści.

LittleCoding
źródło
1
Wszystkie jednostki mają już znacznik pamięci podręcznej (np. Węzeł: 123), który jest automatycznie unieważniany. Jeśli więc tworzysz / aktualizujesz i wyświetlasz węzły, nie powinieneś nic robić, powinno po prostu działać.
Berdir,
podczas tworzenia / aktualizacji wymagałoby zapytania, aby znaleźć wszystkie powiązane typy treści (węzły, bloki, jednostki), a następnie usunąć je z każdej tabeli pamięci podręcznej. Jeśli pojedynczy niestandardowy znacznik pamięci podręcznej jest używany do identyfikacji relacji elementów treści, tylko ten znacznik musiałby zostać unieważniony, aby wyczyścić pamięć podręczną tych powiązanych elementów.
LittleCoding
Nie rozumiem, co masz na myśli i jaka jest twoja struktura. Tagi są dodawane, gdy są używane. Znaczniki pamięci podręcznej należy dodać do każdego elementu renderowania, takiego jak blok, jeśli trzeba go zmienić, jeśli ten węzeł / rzecz zostanie zmieniona. Jeśli używasz standardowych mechanizmów do wyświetlania jednostek, prawdopodobnie tak już jest. Jeśli to nie działa, musisz udostępnić bardziej szczegółowo, z kodem, co dokładnie robisz.
Berdir
użytkownik znacznika pamięci podręcznej: {ID} może zostać unieważniony, aby uruchomić czyszczenie pamięci podręcznej dla całej zawartości związanej z tym użytkownikiem. Ten sam pomysł, ale z niestandardowym znacznikiem pamięci podręcznej.
LittleCoding

Odpowiedzi:

13

Oto jak używać znaczników pamięci podręcznej w kontekście niestandardowych bloków, które próbowałem i działam, ale myślę, że dotyczy to innych kontekstów

Użyj domyślnych tagów drupal

W tablicy kompilacji, którą możesz określić, cache > tags > node_listtreść bloku zostanie unieważniona (odświeżona), gdy DOWOLNY WĘDEK zostanie zmieniony i nic więcej nie zrobisz z twojej strony

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
        ],
    );
}

Alternatywnie możesz podać jeden lub więcej identyfikatorów węzłów / terminów / użytkowników, aby unieważnić tablicę na określonych węzłach lub terminach, jak pokazano w komentarzu do kodu powyżej. Uwaga: możesz łączyć i dopasowywać węzły, terminy, użytkowników i tagi niestandardowe według własnego uznania.

Użyj własnych tagów

jeśli chcesz mieć własny sposób czyszczenia tablicy kompilacji, dodaj niestandardowy unikatowy tag do tablicy kompilacji (wystarczy dowolny unikatowy ciąg)

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

oraz w niestandardowym wywołaniu logiki kodu invalidateTagsz własnym znacznikiem

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

jeśli chcesz przeczytać więcej o wewnętrznych elementach pamięci podręcznej drupal 8

GiorgosK
źródło
2
Myślę, że idealnie byłoby skorzystać z cache_tags.invalidatorusługi, a nie bezpośrednio odwoływać się do klasy.
Andy,