Verificación de acceso + cacheabilidad
Los verificadores de acceso a rutas, hook_entity_access() y todo lo que devuelva un objeto AccessResultInterface, deben añadir los metadatos de cacheabilidad correspondientes.
Si aún no lo ha leído, revise las etiquetas de caché (cache tags), contextos de caché (cache contexts) y max-age.
Parámetros para la verificación de acceso
El mecanismo de verificación de acceso recibirá varios parámetros — al menos la cuenta de usuario (AccountInterface) y frecuentemente un objeto. Luego tomará una decisión basada en las propiedades de estos parámetros.
Se debe añadir una dependencia cacheable del parámetro $parameter si el cambio en alguna propiedad de dicho parámetro cambia el resultado del acceso.
Por ejemplo:
$access_result = AccessResult::allowedIf($node->isPublished()) // El resultado del acceso depende de una propiedad del objeto que puede cambiar: es una dependencia cacheable. ->addCacheableDependency($node);
Otro caso común es cuando el resultado del acceso depende de una propiedad que no puede cambiar (normalmente un identificador o UUID). Por ejemplo, permitir acceso si la cuenta de usuario dada es el propietario del objeto:
$access_result = AccessResult::allowedIf($node->getOwnerId() === $account->id())
// El resultado del acceso depende del propietario del nodo, y el propietario podría cambiar.
->addCacheableDependency($node);
// El resultado del acceso también depende de una cuenta de usuario, y el ID de la cuenta de usuario nunca cambia. Por eso no es necesario añadir $account como dependencia cacheable.
// Pero, si $account es el usuario actual, y no un usuario codificado, también debemos asegurarnos de variar la caché por usuario actual para no ejecutar esta verificación una sola vez y luego reutilizar su resultado para todos los usuarios.
if ($account->id() === \Drupal::currentUser()->id()) {
$access_result->cachePerUser();
}