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(); }
Drupal’s online documentation is © 2000-2020 by the individual contributors and can be used in accordance with the Creative Commons License, Attribution-ShareAlike 2.0. PHP code is distributed under the GNU General Public License.