Implementación de etiquetas de caché personalizadas

14

Me gustaría usar el nuevo etiquetado de caché en D8 para ayudar a mantener sincronizado el contenido relacionado de diferentes tipos (entidades, nodos, bloques, etc.). Pero al leer la documentación actualmente disponible de esta función, no entiendo cómo agregar mi propia etiqueta de caché a los elementos de contenido al crear / actualizar dichos elementos.

Por ejemplo, al crear un nuevo nodo de un tipo Tienda, me gustaría agregar la ubicación de la etiqueta de caché: new_york_123 y lo mismo para un bloque. Luego, si cambiara el nombre para mostrar de la ubicación 123 de Nueva York a SoHo, podría invalidar la etiqueta de caché y tener toda la actualización de contenido relacionada.

LittleCoding
fuente
1
Todas las entidades ya tienen una etiqueta de caché (por ejemplo, nodo: 123) que se invalida automáticamente. Entonces, si solo está creando / actualizando y mostrando nodos, no debería tener que hacer nada, simplemente debería funcionar.
Berdir
al crear / actualizar, se requeriría una consulta para encontrar todos los tipos relacionados de contenido (nodos, bloques, entidades) y luego borrarlos de cada tabla de caché. Si se usa una sola etiqueta de caché personalizada para identificar la relación de los elementos de contenido, solo esa etiqueta necesitaría ser invalidada para borrar la caché de esos elementos relacionados.
LittleCoding
No entiendo a qué te refieres y cuál es tu estructura. Las etiquetas se agregan cuando se usan. Las etiquetas de caché se deben agregar a cualquier elemento de representación como un bloque si necesita cambiar si se cambia ese nodo / cosa. Si utiliza mecanismos estándar para mostrar entidades, es probable que ese sea el caso. Si no funciona, debe compartir con más detalle, con código, lo que está haciendo exactamente.
Berdir
usuario de etiqueta de caché: {ID} podría invalidarse para activar el borrado de caché para todo el contenido relacionado con ese usuario. La misma idea, pero con la etiqueta de caché personalizada.
LittleCoding

Respuestas:

13

Aquí se explica cómo usar etiquetas de caché en el contexto de bloques personalizados que he probado y funciona, pero creo que se aplica a otros contextos.

Usar etiquetas drupal predeterminadas

En la matriz de compilación puede especificar cache > tags > node_listy este contenido de bloque se invalidaría (actualizaría) cuando CUALQUIER NODO se cambie sin nada más que hacer de su parte

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

Alternativamente , puede poner uno o más ID de nodo / término / usuario para invalidar la matriz en nodos o términos específicos como se muestra en el comentario del código anterior. Nota: puede mezclar y combinar nodos, términos, usuarios y etiquetas personalizadas como mejor le parezca.

Usa tus propias etiquetas

si desea tener su propia forma de borrar su matriz de compilación, agregue su etiqueta única personalizada en la matriz de compilación (cualquier cadena única servirá)

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

y en su código lógico personalizado llame invalidateTagscon su propia etiqueta

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

si desea leer más sobre los componentes internos de caché de drupal 8

GiorgosK
fuente
2
Creo que idealmente usaría el cache_tags.invalidatorservicio en lugar de hacer referencia a una clase directamente.
Andy