Controllo degli accessi + cacheability
I controllori di accesso alla rotta, hook_entity_access() e qualsiasi elemento che deve restituire un oggetto AccessResultInterface, devono aggiungere le relative metainformazioni di cacheability.
Se non lo hai già fatto, leggi cache tags, cache contexts e max-age.
Parametri del controllo di accesso
Il controllore di accesso riceverà vari parametri – almeno l’account utente (AccountInterface) e spesso un oggetto. Successivamente prenderà decisioni basate sulle proprietà di questi parametri.
Una dipendenza di cache da $parameter deve essere aggiunta se la modifica di almeno una proprietà di quel parametro può cambiare il risultato dell’accesso.
Ad esempio:
$access_result = AccessResult::allowedIf($node->isPublished()) // Il risultato di accesso dipende da una proprietà dell'oggetto che può cambiare: è una dipendenza cacheable. ->addCacheableDependency($node);
Un altro caso comune è quando il risultato di accesso dipende da una proprietà che non può cambiare (di solito un identificatore o un UUID). Ad esempio, consentire l’accesso se un dato account utente è il proprietario dell’oggetto:
$access_result = AccessResult::allowedIf($node->getOwnerId() === $account->id())
// Il risultato di accesso dipende dal proprietario del nodo, che può cambiare.
->addCacheableDependency($node);
// Il risultato di accesso dipende anche da un account utente, ma l'ID dell'account non cambia mai.
// Quindi non è necessario aggiungere $account come dipendenza cacheable.
// Tuttavia, se $account è l'utente corrente e non un utente hardcoded,
// dobbiamo assicurarci che la cache vari per utente, così da non riutilizzare lo stesso
// risultato di accesso per tutti gli utenti.
if ($account->id() === \Drupal::currentUser()->id()) {
$access_result->cachePerUser();
}