¿Cómo borrar la caché de comodines en Drupal 8?

8

En Drupal 7, solíamos poder hacer esto:

cache_clear_all('state:', 'cache', TRUE)

que eliminaría cualquier entrada de bin de caché que comenzara con la cadena state:(ID de caché coincidentes como state:infoy state:nebraska).

El registro de cambios en https://www.drupal.org/node/1272696 incluso señala este caso de uso en el ejemplo de Drupal 7, pero en realidad no proporciona un ejemplo de cómo replicarlo en D8.

Parece que se supone que debemos usar etiquetas de caché, lo que parece una conversión más costosa teniendo en cuenta el caso de uso simple. No veo ningún método coincidente que se aplique en CacheBackendInterface . Tenga en cuenta que no se trata de eliminar todos los elementos en un contenedor de caché, que está claramente cubierto por deleteAll ().

Dave Reid
fuente

Respuestas:

8

No estoy seguro de por qué se eliminó la respuesta existente, era (casi) correcta.

Se eliminó el borrado de caché comodín. Fue extremadamente complicado admitir en backends como redis y memcache, que no tienen soporte comodín.

Las etiquetas de caché son el reemplazo y no es tan complicado de usar. Simplemente pasa una lista de cadenas como el 4to argumento (un poco molesto que tengas que establecer el argumento de marca de tiempo predeterminado, un método separado sería bueno):

\Drupal::cache('default')->set('state:info', $your_data, Cache::PERMANENT, 
['state']);

y luego llame a:

\Drupal\Core\Cache\Cache::invalidateTags(array('state'));
Berdir
fuente
Ok, ayudaré a actualizar el aviso de cambio para que sea más explícito que las etiquetas de caché deben usarse como reemplazo.
Dave Reid
¿Cuál es una forma confiable de obtener todas las claves de caché que deben etiquetarse para su eliminación? Por ejemplo, si quiero borrar 'entity_bundle_extra_fields:node:article:' . $langcodepara todos los idiomas? Podría obtener una lista de todos los idiomas, pero ¿hay algo más simple? En este caso ya tiene una etiqueta de caché, 'entity_field_info'. Pero tal vez quiero invalidar menos amplio.
donquixote
No no hay. La API de caché no tiene método de consulta / lista. Y no debe interactuar directamente con las entradas de caché de otra persona, use la API, por ejemplo, las definiciones de caché claras del administrador de campo de la entidad en este caso. Esas entradas de caché no son una API, el núcleo es libre de cambiar las claves / estructura y luego su código se rompería
Berdir