Implementando tags de cache personalizadas

13

Gostaria de usar a nova marcação de cache no D8 para ajudar a manter o conteúdo relacionado de diferentes tipos (entidades, nós, blocos, etc.) sincronizados. Mas, lendo a documentação atualmente disponível sobre esse recurso, não entendo como adicionar minha própria tag de cache aos itens de conteúdo ao criar / atualizar esses itens.

Por exemplo, ao criar um novo nó de um tipo Store, gostaria de adicionar o local da tag de cache: new_york_123 e o mesmo para um bloco. Então, se eu alterasse o nome de exibição do local 123 de Nova York para SoHo, poderia invalidar a tag de cache e atualizar todo o conteúdo relacionado.

LittleCoding
fonte
1
Todas as entidades já possuem uma tag de cache (por exemplo, nó: 123) que é automaticamente invalidada. Portanto, se você está apenas criando / atualizando e exibindo nós, não precisa fazer nada, deve funcionar.
Berdir 18/07/16
ao criar / atualizar, seria necessária uma consulta para encontrar todos os tipos de conteúdo relacionados (nós, blocos, entidades) e depois limpá-los de cada tabela de cache. Se uma única tag de cache personalizada for usada para identificar o relacionamento dos itens de conteúdo, somente essa tag precisará ser invalidada para limpar o cache desses itens relacionados.
LittleCoding 18/07/2016
Não entendo o que você quer dizer e qual é a sua estrutura. Tags são adicionadas quando são usadas. As tags de cache devem ser adicionadas a qualquer elemento de renderização como um bloco, se precisar mudar, se esse nó / coisa for alterado. Se você usar mecanismos padrão para exibir entidades, provavelmente já é esse o caso. Se não funcionar, você precisará compartilhar com mais detalhes, com código, o que exatamente você está fazendo.
Berdir 18/07/2016
usuário da tag de cache: {ID} pode ser invalidado para acionar a limpeza do cache de todo o conteúdo relacionado a esse usuário. Mesma ideia, mas com a tag de cache personalizada.
LittleCoding 18/07/2016

Respostas:

12

Aqui está como usar tags de cache no contexto de blocos personalizados que eu tentei e funciona, mas acho que se aplica a outros contextos

Use tags drupal padrão

Na matriz de compilação, você pode especificar cache > tags > node_liste esse conteúdo do bloco será invalidado (atualizado) quando QUALQUER NOME for alterado, sem mais nada a fazer da sua 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
        ],
    );
}

Como alternativa, você pode inserir um ou mais IDs de nó / termo / usuário para invalidar a matriz em nós ou termos específicos, conforme mostrado no comentário de código acima. Nota: você pode misturar e combinar nós, termos, usuários e tags personalizadas conforme desejar.

Use suas próprias tags

se você quiser ter sua própria maneira de limpar sua matriz de compilação, adicione sua tag exclusiva personalizada na matriz de compilação (qualquer string exclusiva serve)

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

e em sua chamada lógica de código personalizado invalidateTagscom sua própria tag

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

se você quiser ler mais sobre os internos do cache do drupal 8

GiorgosK
fonte
2
Eu acho que idealmente você usaria o cache_tags.invalidatorserviço em vez de referenciar uma classe diretamente.
Andy