Implementazione di tag cache personalizzati


14

Vorrei utilizzare il nuovo Cache Tagging in D8 per mantenere sincronizzati i contenuti correlati di diversi tipi (entità, nodi, blocchi, ecc.). Ma dalla lettura della documentazione attualmente disponibile di questa funzione non capisco come aggiungere il mio tag cache agli elementi di contenuto durante la creazione / l'aggiornamento di tali elementi.

Ad esempio, quando si crea un nuovo nodo di un tipo Store, vorrei aggiungere la posizione del tag cache: new_york_123 e lo stesso per un blocco. Quindi, se ho cambiato il nome visualizzato del percorso New York 123 in SoHo, potrei invalidare il tag cache e avere tutto l'aggiornamento del contenuto correlato.


1
Tutte le entità hanno già un tag cache (ad esempio nodo: 123) che viene automaticamente invalidato. Quindi, se stai solo creando / aggiornando e visualizzando nodi, non dovresti fare nulla, dovrebbe semplicemente funzionare.
Berdir,

al momento della creazione / aggiornamento richiederebbe una query per trovare tutti i tipi di contenuto correlati (nodi, blocchi, entità) e quindi cancellarli da ogni tabella di cache. Se viene utilizzato un singolo tag cache personalizzato per identificare la relazione degli elementi di contenuto, solo quel tag dovrebbe essere invalidato per cancellare la cache di quegli elementi correlati.
LittleCoding

Non capisco cosa intendi e quale sia la tua struttura. I tag vengono aggiunti quando vengono utilizzati. I tag della cache devono essere aggiunti a qualsiasi elemento di rendering come un blocco se deve essere modificato se quel nodo / oggetto viene modificato. Se si utilizzano meccanismi standard per visualizzare entità, è probabile che sia già così. Se non funziona, devi condividere in modo più dettagliato, con il codice, cosa stai facendo esattamente.
Berdir,

utente tag cache: {ID} potrebbe essere invalidato per attivare la cancellazione della cache per tutto il contenuto relativo a quell'utente. Stessa idea, ma con il tag cache personalizzato.
LittleCoding

Risposte:


13

Ecco come utilizzare i tag cache nel contesto di blocchi personalizzati che ho provato e funziona ma penso che si applichi ad altri contesti

Usa i tag drupal predefiniti

Nell'array build è possibile specificare cache > tags > node_liste il contenuto di questo blocco verrebbe invalidato (aggiornato) quando QUALUNQUE NODO viene modificato con nient'altro da fare da parte tua

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

In alternativa è possibile inserire uno o più ID nodo / termine / utente per invalidare l'array su nodi o termini specifici, come mostrato nel commento di codice sopra. Nota: puoi combinare nodi, termini, utenti e tag personalizzati secondo le tue esigenze.

Usa i tuoi tag

se vuoi avere il tuo modo di cancellare l'array di build aggiungi il tuo tag univoco personalizzato nell'array di build (qualsiasi stringa univoca lo farà)

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

e nella tua logica del codice personalizzata chiama invalidateTagscon il tuo tag

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

se vuoi leggere di più su Drupal 8 cache internals


2
Penso che idealmente useresti il cache_tags.invalidatorservizio piuttosto che fare riferimento direttamente a una classe.
Andy,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.