Toegangscontrole + cachebaarheid
Route-toegangscontroles, hook_entity_access() en alles wat vereist is om een AccessResultInterface-object terug te geven, moeten de juiste cache-metagegevens toevoegen.
Als je het nog niet hebt gelezen, bekijk dan cache tags, cache contexts en max-age.
Parameters voor toegangscontrole
De toegangschecker ontvangt verschillende parameters – ten minste het gebruikersaccount (AccountInterface) en vaak een object. Vervolgens neemt hij een beslissing op basis van de eigenschappen van deze parameters.
Een cachebare afhankelijkheid van $parameter moet worden toegevoegd als een wijziging in ten minste één eigenschap van deze parameter het toegangsresultaat zou veranderen.
Bijvoorbeeld:
$access_result = AccessResult::allowedIf($node->isPublished()) // Toegangsresultaat hangt af van een eigenschap van het object die kan veranderen: het is een cachebare afhankelijkheid. ->addCacheableDependency($node);
Een ander veelvoorkomend geval is wanneer het toegangsresultaat afhangt van een eigenschap die niet kan veranderen (meestal een ID of UUID). Bijvoorbeeld, toegang toestaan als het opgegeven gebruikersaccount de eigenaar van het object is:
$access_result = AccessResult::allowedIf($node->getOwnerId() === $account->id())
// Toegangsresultaat hangt af van de eigenaar van de node, de eigenaar kan veranderen.
->addCacheableDependency($node);
// Toegangsresultaat hangt ook af van een gebruikersaccount, en de ID van het gebruikersaccount kan nooit veranderen. Daarom hoeven we $account niet als cachebare afhankelijkheid toe te voegen.
// Maar, als $account de huidige gebruiker is, en niet een hardgecodeerde gebruiker, moeten we er ook voor zorgen dat we variëren per huidige gebruiker, zodat we deze toegangscontrole niet één keer uitvoeren en vervolgens het resultaat voor alle gebruikers hergebruiken.
if ($account->id() === \Drupal::currentUser()->id()) {
$access_result->cachePerUser();
}