core/lib/Drupal/Core/Access/AccessManager.php | 42 ++++++----------- core/lib/Drupal/Core/Access/CsrfAccessCheck.php | 13 ++++-- core/lib/Drupal/Core/Access/CustomAccessCheck.php | 16 +++++-- core/lib/Drupal/Core/Access/DefaultAccessCheck.php | 15 +++++-- .../Core/Cache/CacheabilityAffectorInterface.php | 52 ++++++++++++++++++++++ core/lib/Drupal/Core/Entity/EntityAccessCheck.php | 16 +++++-- .../Drupal/Core/Entity/EntityCreateAccessCheck.php | 15 +++++-- core/lib/Drupal/Core/Routing/Access/AccessBase.php | 52 ++++++++++++++++++++++ .../Drupal/Core/Routing/Access/AccessInterface.php | 18 +++----- core/lib/Drupal/Core/Theme/ThemeAccessCheck.php | 15 +++++-- .../src/Access/BookNodeIsRemovableAccessCheck.php | 16 +++++-- .../src/Access/ConfigTranslationFormAccess.php | 12 ++++- .../src/Access/ConfigTranslationOverviewAccess.php | 16 +++++-- .../contact/src/Access/ContactPageAccess.php | 16 +++++-- .../Access/ContentTranslationManageAccessCheck.php | 16 +++++-- .../Access/ContentTranslationOverviewAccess.php | 16 +++++-- .../field_ui/src/Access/FormModeAccessCheck.php | 15 +++++-- .../field_ui/src/Access/ViewModeAccessCheck.php | 19 ++++++-- core/modules/menu_link/src/MenuTree.php | 23 +++++++--- .../modules/node/src/Access/NodeAddAccessCheck.php | 15 +++++-- .../node/src/Access/NodeRevisionAccessCheck.php | 16 +++++-- .../quickedit/src/Access/EditEntityAccessCheck.php | 16 +++++-- .../src/Access/EditEntityFieldAccessCheck.php | 16 +++++-- core/modules/rest/src/Access/CSRFAccessCheck.php | 13 ++++-- .../src/Access/ShortcutSetSwitchAccessCheck.php | 15 +++++-- core/modules/system/src/Access/CronAccessCheck.php | 16 +++++-- .../src/Access/DefinedTestAccessCheck.php | 20 ++++++++- .../src/Access/TestAccessCheck.php | 21 ++++++++- .../src/Access/ViewOwnTrackerAccessCheck.php | 15 +++++-- .../update/src/Access/UpdateManagerAccessCheck.php | 16 +++++-- core/modules/user/src/Access/LoginStatusCheck.php | 13 ++++-- .../user/src/Access/PermissionAccessCheck.php | 13 ++++-- .../user/src/Access/RegisterAccessCheck.php | 13 ++++-- core/modules/user/src/Access/RoleAccessCheck.php | 13 ++++-- core/modules/views/src/ViewsAccessCheck.php | 12 ++++- 35 files changed, 508 insertions(+), 138 deletions(-) diff --git a/core/lib/Drupal/Core/Access/AccessManager.php b/core/lib/Drupal/Core/Access/AccessManager.php index e5e4c44..74c87b8 100644 --- a/core/lib/Drupal/Core/Access/AccessManager.php +++ b/core/lib/Drupal/Core/Access/AccessManager.php @@ -236,44 +236,28 @@ public function checkNamedRoute($route_name, array $parameters = array(), Accoun } } - public function getRoleCacheableAccessChecks() { - $role_cacheable_checks = array(); + /** + * Returns all available access checks that are cacheable. + * + * @return array + * An array with the keys being the cacheable access check service IDs and + * the values being the corresponding cache contexts that they must be + * varied by. + */ + public function getCacheableAccessChecks() { + $cacheable_checks = array(); foreach ($this->checkIds as $service_id) { if (empty($this->checks[$service_id])) { $this->loadCheck($service_id); } - if ($this->checks[$service_id]->isCacheablePerRole()) { - $role_cacheable_checks[] = $service_id; + if ($this->checks[$service_id]->isCacheable()) { + $cacheable_checks[$service_id] = $this->checks[$service_id]->getCacheContexts(); } } - return $role_cacheable_checks; - } - - public function getAccessCacheability($route_name, array $parameters = array()) { - try { - $route = $this->routeProvider->getRouteByName($route_name, $parameters); - $checks = $route->getOption('_access_checks') ?: array(); - - foreach ($checks as $service_id) { - if (empty($this->checks[$service_id])) { - $this->loadCheck($service_id); - } - - $check = $this->checks[$service_id]; - if (!$check->isCacheable()) { - return FALSE; - } - else { - - } - } - } - catch (RouteNotFoundException $e) { - return FALSE; - } + return $cacheable_checks; } /** diff --git a/core/lib/Drupal/Core/Access/CsrfAccessCheck.php b/core/lib/Drupal/Core/Access/CsrfAccessCheck.php index 14f30dc..0b8e13f 100644 --- a/core/lib/Drupal/Core/Access/CsrfAccessCheck.php +++ b/core/lib/Drupal/Core/Access/CsrfAccessCheck.php @@ -7,7 +7,7 @@ namespace Drupal\Core\Access; -use Drupal\Core\Routing\Access\AccessInterface as RoutingAccessInterface; +use Drupal\Core\Routing\Access\AccessBase; use Symfony\Component\Routing\Route; use Symfony\Component\HttpFoundation\Request; @@ -18,7 +18,7 @@ * a token generated by \Drupal::csrfToken()->get() using the same value as the * "_csrf_token" parameter in the route. */ -class CsrfAccessCheck implements RoutingAccessInterface { +class CsrfAccessCheck extends AccessBase { /** * The CSRF token generator. @@ -71,8 +71,15 @@ public function access(Route $route, Request $request) { /** * {@inheritdoc} */ - public function isCacheablePerRole() { + public function isCacheable() { return FALSE; } + /** + * {@inheritdoc} + */ + public function getCacheContexts() { + return array(); + } + } diff --git a/core/lib/Drupal/Core/Access/CustomAccessCheck.php b/core/lib/Drupal/Core/Access/CustomAccessCheck.php index 269e0d9..55542f7 100644 --- a/core/lib/Drupal/Core/Access/CustomAccessCheck.php +++ b/core/lib/Drupal/Core/Access/CustomAccessCheck.php @@ -8,7 +8,7 @@ namespace Drupal\Core\Access; use Drupal\Core\Controller\ControllerResolverInterface; -use Drupal\Core\Routing\Access\AccessInterface as RoutingAccessInterface; +use Drupal\Core\Routing\Access\AccessBase; use Drupal\Core\Session\AccountInterface; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\Routing\Route; @@ -23,7 +23,7 @@ * cannot reuse any stored property of your actual controller instance used * to generate the output. */ -class CustomAccessCheck implements RoutingAccessInterface { +class CustomAccessCheck extends AccessBase { /** * The controller resolver. @@ -73,9 +73,19 @@ public function access(Route $route, Request $request, AccountInterface $account /** * {@inheritdoc} + * + * @todo consider removing this access check, because it's impossible to + * collect cache tags and contexts for. */ - public function isCacheablePerRole() { + public function isCacheable() { return FALSE; } + /** + * {@inheritdoc} + */ + public function getCacheContexts() { + return array(); + } + } diff --git a/core/lib/Drupal/Core/Access/DefaultAccessCheck.php b/core/lib/Drupal/Core/Access/DefaultAccessCheck.php index ad0e748..25e045f 100644 --- a/core/lib/Drupal/Core/Access/DefaultAccessCheck.php +++ b/core/lib/Drupal/Core/Access/DefaultAccessCheck.php @@ -7,13 +7,13 @@ namespace Drupal\Core\Access; -use Drupal\Core\Routing\Access\AccessInterface as RoutingAccessInterface; +use Drupal\Core\Routing\Access\AccessBase; use Symfony\Component\Routing\Route; /** * Allows access to routes to be controlled by an '_access' boolean parameter. */ -class DefaultAccessCheck implements RoutingAccessInterface { +class DefaultAccessCheck extends AccessBase { /** * Checks access to the route based on the _access parameter. @@ -39,8 +39,17 @@ public function access(Route $route) { /** * {@inheritdoc} */ - public function isCacheablePerRole() { + public function isCacheable() { return TRUE; } + /** + * {@inheritdoc} + * + * This is globally cacheable. + */ + public function getCacheContexts() { + return array(); + } + } diff --git a/core/lib/Drupal/Core/Cache/CacheabilityAffectorInterface.php b/core/lib/Drupal/Core/Cache/CacheabilityAffectorInterface.php new file mode 100644 index 0000000..093d278 --- /dev/null +++ b/core/lib/Drupal/Core/Cache/CacheabilityAffectorInterface.php @@ -0,0 +1,52 @@ +get('access_manager'); + + // Find all access checks whose results are cacheable per user role + // (or globally cacheable, because that means the access check's result + // doesn't depend on anything external to the access check itself). + $cacheable_access_checks = $access_manager->getCacheableAccessChecks(); + $is_cacheable = function ($cache_contexts) { + $is_globally_cacheable = empty($cache_contexts); + $is_role_cacheable = $cache_contexts === array('cache_context.user.roles'); + return $is_globally_cacheable || $is_role_cacheable; + }; + $cacheable_access_checks = array_keys(array_filter($cacheable_access_checks, $is_cacheable)); + foreach ($tree as $key => $v) { $item = &$tree[$key]['link']; - - /** @var \Drupal\Core\Access\AccessManager $access_manager **/ - $access_manager = \Drupal::getContainer()->get('access_manager'); if ($item['external'] || empty($item['route_name'])) { $item['access'] = 1; $item['access_checks'] = array(); @@ -828,9 +839,9 @@ public function checkNonDynamicAccess(array $tree) { try { $route = \Drupal::getContainer()->get('router.route_provider')->getRouteByName($item['route_name'], $item['route_parameters']); $checks = $route->getOption('_access_checks') ?: array(); - // If this route has any permissions that are not cacheable per role, - // don't apply access checks here yet. - if (count(array_diff($checks, $access_manager->getRoleCacheableAccessChecks()))) { + // If this route has any access checks whose results cannot be cached + // per role, then don't perform access checking here. + if (count(array_diff($checks, $cacheable_access_checks))) { $item['access_checks'] = $checks; } else { diff --git a/core/modules/node/src/Access/NodeAddAccessCheck.php b/core/modules/node/src/Access/NodeAddAccessCheck.php index c830fac..90ec739 100644 --- a/core/modules/node/src/Access/NodeAddAccessCheck.php +++ b/core/modules/node/src/Access/NodeAddAccessCheck.php @@ -8,14 +8,14 @@ namespace Drupal\node\Access; use Drupal\Core\Entity\EntityManagerInterface; -use Drupal\Core\Routing\Access\AccessInterface; +use Drupal\Core\Routing\Access\AccessBase; use Drupal\Core\Session\AccountInterface; use Drupal\node\NodeTypeInterface; /** * Determines access to for node add pages. */ -class NodeAddAccessCheck implements AccessInterface { +class NodeAddAccessCheck extends AccessBase { /** * The entity manager. @@ -64,8 +64,15 @@ public function access(AccountInterface $account, NodeTypeInterface $node_type = /** * {@inheritdoc} */ - public function isCacheablePerRole() { - return FALSE; + public function isCacheable() { + return TRUE; + } + + /** + * {@inheritdoc} + */ + public function getCacheContexts() { + return array('cache_context.user'); } } diff --git a/core/modules/node/src/Access/NodeRevisionAccessCheck.php b/core/modules/node/src/Access/NodeRevisionAccessCheck.php index f409f73..08aa973 100644 --- a/core/modules/node/src/Access/NodeRevisionAccessCheck.php +++ b/core/modules/node/src/Access/NodeRevisionAccessCheck.php @@ -9,7 +9,7 @@ use Drupal\Core\Database\Connection; use Drupal\Core\Entity\EntityManagerInterface; -use Drupal\Core\Routing\Access\AccessInterface; +use Drupal\Core\Routing\Access\AccessBase; use Drupal\Core\Session\AccountInterface; use Drupal\node\NodeInterface; use Symfony\Component\Routing\Route; @@ -17,7 +17,7 @@ /** * Provides an access checker for node revisions. */ -class NodeRevisionAccessCheck implements AccessInterface { +class NodeRevisionAccessCheck extends AccessBase { /** * The node storage. @@ -164,9 +164,19 @@ public function checkAccess(NodeInterface $node, AccountInterface $account, $op /** * {@inheritdoc} + * + * @todo This would be cacheable per user if we could associate the cache tag + * of the entity being translated. */ - public function isCacheablePerRole() { + public function isCacheable() { return FALSE; } + /** + * {@inheritdoc} + */ + public function getCacheContexts() { + return array(); + } + } diff --git a/core/modules/quickedit/src/Access/EditEntityAccessCheck.php b/core/modules/quickedit/src/Access/EditEntityAccessCheck.php index 2f5c3d5..b083201 100644 --- a/core/modules/quickedit/src/Access/EditEntityAccessCheck.php +++ b/core/modules/quickedit/src/Access/EditEntityAccessCheck.php @@ -8,7 +8,7 @@ namespace Drupal\quickedit\Access; use Drupal\Core\Entity\EntityManagerInterface; -use Drupal\Core\Routing\Access\AccessInterface; +use Drupal\Core\Routing\Access\AccessBase; use Drupal\Core\Session\AccountInterface; use Symfony\Component\HttpFoundation\Request; use Drupal\Core\Entity\EntityInterface; @@ -16,7 +16,7 @@ /** * Access check for editing entities with QuickEdit. */ -class EditEntityAccessCheck implements AccessInterface { +class EditEntityAccessCheck extends AccessBase { /** * The entity manager. @@ -89,9 +89,19 @@ protected function validateAndUpcastRequestAttributes(Request $request) { /** * {@inheritdoc} + * + * @todo This would be cacheable per user if we could associate the cache tag + * of the entity being edited. */ - public function isCacheablePerRole() { + public function isCacheable() { return FALSE; } + /** + * {@inheritdoc} + */ + public function getCacheContexts() { + return array(); + } + } diff --git a/core/modules/quickedit/src/Access/EditEntityFieldAccessCheck.php b/core/modules/quickedit/src/Access/EditEntityFieldAccessCheck.php index 0668868..a17c5ba 100644 --- a/core/modules/quickedit/src/Access/EditEntityFieldAccessCheck.php +++ b/core/modules/quickedit/src/Access/EditEntityFieldAccessCheck.php @@ -8,7 +8,7 @@ namespace Drupal\quickedit\Access; use Drupal\Core\Entity\EntityManagerInterface; -use Drupal\Core\Routing\Access\AccessInterface; +use Drupal\Core\Routing\Access\AccessBase; use Drupal\Core\Session\AccountInterface; use Symfony\Component\HttpFoundation\Request; use Drupal\Core\Entity\EntityInterface; @@ -16,7 +16,7 @@ /** * Access check for editing entity fields. */ -class EditEntityFieldAccessCheck implements AccessInterface, EditEntityFieldAccessCheckInterface { +class EditEntityFieldAccessCheck extends AccessBase implements EditEntityFieldAccessCheckInterface { /** * The entity manager. @@ -103,9 +103,19 @@ protected function validateAndUpcastRequestAttributes(Request $request) { /** * {@inheritdoc} + * + * @todo This would be cacheable per user if we could associate the cache tag + * of the entity being edited. */ - public function isCacheablePerRole() { + public function isCacheable() { return FALSE; } + /** + * {@inheritdoc} + */ + public function getCacheContexts() { + return array(); + } + } diff --git a/core/modules/rest/src/Access/CSRFAccessCheck.php b/core/modules/rest/src/Access/CSRFAccessCheck.php index bb4fc92..eeef06e 100644 --- a/core/modules/rest/src/Access/CSRFAccessCheck.php +++ b/core/modules/rest/src/Access/CSRFAccessCheck.php @@ -7,7 +7,7 @@ namespace Drupal\rest\Access; -use Drupal\Core\Access\AccessCheckInterface; +use Drupal\Core\Access\AccessBase; use Drupal\Core\Session\AccountInterface; use Symfony\Component\Routing\Route; use Symfony\Component\HttpFoundation\Request; @@ -15,7 +15,7 @@ /** * Access protection against CSRF attacks. */ -class CSRFAccessCheck implements AccessCheckInterface { +class CSRFAccessCheck extends AccessBase { /** * Implements AccessCheckInterface::applies(). @@ -75,8 +75,15 @@ public function access(Request $request, AccountInterface $account) { /** * {@inheritdoc} */ - public function isCacheablePerRole() { + public function isCacheable() { return FALSE; } + /** + * {@inheritdoc} + */ + public function getCacheContexts() { + return array(); + } + } diff --git a/core/modules/shortcut/src/Access/ShortcutSetSwitchAccessCheck.php b/core/modules/shortcut/src/Access/ShortcutSetSwitchAccessCheck.php index 8e426e2..80727cf 100644 --- a/core/modules/shortcut/src/Access/ShortcutSetSwitchAccessCheck.php +++ b/core/modules/shortcut/src/Access/ShortcutSetSwitchAccessCheck.php @@ -7,14 +7,14 @@ namespace Drupal\shortcut\Access; -use Drupal\Core\Routing\Access\AccessInterface; +use Drupal\Core\Routing\Access\AccessBase; use Drupal\Core\Session\AccountInterface; use Drupal\user\UserInterface; /** * Checks access to switch a user's shortcut set. */ -class ShortcutSetSwitchAccessCheck implements AccessInterface { +class ShortcutSetSwitchAccessCheck extends AccessBase { /** * Checks access. @@ -49,8 +49,15 @@ public function access(UserInterface $user, AccountInterface $account) { /** * {@inheritdoc} */ - public function isCacheablePerRole() { - return FALSE; + public function isCacheable() { + return TRUE; + } + + /** + * {@inheritdoc} + */ + public function getCacheContexts() { + return array('cache_context.user'); } } diff --git a/core/modules/system/src/Access/CronAccessCheck.php b/core/modules/system/src/Access/CronAccessCheck.php index 08ef919..423ee45 100644 --- a/core/modules/system/src/Access/CronAccessCheck.php +++ b/core/modules/system/src/Access/CronAccessCheck.php @@ -7,12 +7,12 @@ namespace Drupal\system\Access; -use Drupal\Core\Routing\Access\AccessInterface; +use Drupal\Core\Routing\Access\AccessBase; /** * Access check for cron routes. */ -class CronAccessCheck implements AccessInterface { +class CronAccessCheck extends AccessBase { /** * Checks access. @@ -37,9 +37,19 @@ public function access($key) { /** * {@inheritdoc} + * + * @todo This would be cacheable per user if we could associate the cache tag + * of the entity being translated. */ - public function isCacheablePerRole() { + public function isCacheable() { return FALSE; } + /** + * {@inheritdoc} + */ + public function getCacheContexts() { + return array(); + } + } diff --git a/core/modules/system/tests/modules/router_test_directory/src/Access/DefinedTestAccessCheck.php b/core/modules/system/tests/modules/router_test_directory/src/Access/DefinedTestAccessCheck.php index 1469d20..dd66276 100644 --- a/core/modules/system/tests/modules/router_test_directory/src/Access/DefinedTestAccessCheck.php +++ b/core/modules/system/tests/modules/router_test_directory/src/Access/DefinedTestAccessCheck.php @@ -7,13 +7,13 @@ namespace Drupal\router_test\Access; -use Drupal\Core\Routing\Access\AccessInterface; +use Drupal\Core\Routing\Access\AccessBase; use Symfony\Component\Routing\Route; /** * Defines an access checker similar to DefaultAccessCheck */ -class DefinedTestAccessCheck implements AccessInterface { +class DefinedTestAccessCheck extends AccessBase { /** * Checks access. @@ -36,4 +36,20 @@ public function access(Route $route) { } } + /** + * {@inheritdoc} + */ + public function isCacheable() { + return TRUE; + } + + /** + * {@inheritdoc} + * + * This is globally cacheable. + */ + public function getCacheContexts() { + return array(); + } + } diff --git a/core/modules/system/tests/modules/router_test_directory/src/Access/TestAccessCheck.php b/core/modules/system/tests/modules/router_test_directory/src/Access/TestAccessCheck.php index d8af2c6..73be18c 100644 --- a/core/modules/system/tests/modules/router_test_directory/src/Access/TestAccessCheck.php +++ b/core/modules/system/tests/modules/router_test_directory/src/Access/TestAccessCheck.php @@ -7,12 +7,12 @@ namespace Drupal\router_test\Access; -use Drupal\Core\Routing\Access\AccessInterface; +use Drupal\Core\Routing\Access\AccessBase; /** * Access check for test routes. */ -class TestAccessCheck implements AccessInterface { +class TestAccessCheck extends AccessBase { /** * Checks access. @@ -25,4 +25,21 @@ public function access() { // allowed or not. return static::DENY; } + + /** + * {@inheritdoc} + */ + public function isCacheable() { + return TRUE; + } + + /** + * {@inheritdoc} + * + * This is globally cacheable. + */ + public function getCacheContexts() { + return array(); + } + } diff --git a/core/modules/tracker/src/Access/ViewOwnTrackerAccessCheck.php b/core/modules/tracker/src/Access/ViewOwnTrackerAccessCheck.php index 40a8889..68cdebb 100644 --- a/core/modules/tracker/src/Access/ViewOwnTrackerAccessCheck.php +++ b/core/modules/tracker/src/Access/ViewOwnTrackerAccessCheck.php @@ -7,14 +7,14 @@ namespace Drupal\tracker\Access; -use Drupal\Core\Routing\Access\AccessInterface; +use Drupal\Core\Routing\Access\AccessBase; use Drupal\Core\Session\AccountInterface; use Drupal\user\UserInterface; /** * Access check for user tracker routes. */ -class ViewOwnTrackerAccessCheck implements AccessInterface { +class ViewOwnTrackerAccessCheck extends AccessBase { /** * Checks access. @@ -34,8 +34,15 @@ public function access(AccountInterface $account, UserInterface $user) { /** * {@inheritdoc} */ - public function isCacheablePerRole() { - return FALSE; + public function isCacheable() { + return TRUE; + } + + /** + * {@inheritdoc} + */ + public function getCacheContexts() { + return array('cache_context.user'); } } diff --git a/core/modules/update/src/Access/UpdateManagerAccessCheck.php b/core/modules/update/src/Access/UpdateManagerAccessCheck.php index 5586f6f..9967bd3 100644 --- a/core/modules/update/src/Access/UpdateManagerAccessCheck.php +++ b/core/modules/update/src/Access/UpdateManagerAccessCheck.php @@ -7,13 +7,13 @@ namespace Drupal\update\Access; -use Drupal\Core\Routing\Access\AccessInterface; +use Drupal\Core\Routing\Access\AccessBase; use Drupal\Core\Site\Settings; /** * Determines whether allow authorized operations is set. */ -class UpdateManagerAccessCheck implements AccessInterface { +class UpdateManagerAccessCheck extends AccessBase { /** * Settings Service. @@ -44,9 +44,19 @@ public function access() { /** * {@inheritdoc} + * + * @todo This would be cacheable globally if we could associate the cache tag + * of the Settings. */ - public function isCacheablePerRole() { + public function isCacheable() { return FALSE; } + /** + * {@inheritdoc} + */ + public function getCacheContexts() { + return array(); + } + } diff --git a/core/modules/user/src/Access/LoginStatusCheck.php b/core/modules/user/src/Access/LoginStatusCheck.php index 3fd8e80..577b846 100644 --- a/core/modules/user/src/Access/LoginStatusCheck.php +++ b/core/modules/user/src/Access/LoginStatusCheck.php @@ -7,14 +7,14 @@ namespace Drupal\user\Access; -use Drupal\Core\Routing\Access\AccessInterface; +use Drupal\Core\Routing\Access\AccessBase; use Drupal\Core\Session\AccountInterface; use Symfony\Component\HttpFoundation\Request; /** * Determines access to routes based on login status of current user. */ -class LoginStatusCheck implements AccessInterface { +class LoginStatusCheck extends AccessBase { /** * Checks access. @@ -34,8 +34,15 @@ public function access(Request $request, AccountInterface $account) { /** * {@inheritdoc} */ - public function isCacheablePerRole() { + public function isCacheable() { return TRUE; } + /** + * {@inheritdoc} + */ + public function getCacheContexts() { + return array('cache_context.user.roles'); + } + } diff --git a/core/modules/user/src/Access/PermissionAccessCheck.php b/core/modules/user/src/Access/PermissionAccessCheck.php index 4ecbb22..17f88b6 100644 --- a/core/modules/user/src/Access/PermissionAccessCheck.php +++ b/core/modules/user/src/Access/PermissionAccessCheck.php @@ -7,14 +7,14 @@ namespace Drupal\user\Access; -use Drupal\Core\Routing\Access\AccessInterface; +use Drupal\Core\Routing\Access\AccessBase; use Drupal\Core\Session\AccountInterface; use Symfony\Component\Routing\Route; /** * Determines access to routes based on permissions defined via hook_permission(). */ -class PermissionAccessCheck implements AccessInterface { +class PermissionAccessCheck extends AccessBase { /** * Checks access. @@ -35,8 +35,15 @@ public function access(Route $route, AccountInterface $account) { /** * {@inheritdoc} */ - public function isCacheablePerRole() { + public function isCacheable() { return TRUE; } + /** + * {@inheritdoc} + */ + public function getCacheContexts() { + return array('cache_context.user.roles'); + } + } diff --git a/core/modules/user/src/Access/RegisterAccessCheck.php b/core/modules/user/src/Access/RegisterAccessCheck.php index 2e336b8..f199a62 100644 --- a/core/modules/user/src/Access/RegisterAccessCheck.php +++ b/core/modules/user/src/Access/RegisterAccessCheck.php @@ -7,14 +7,14 @@ namespace Drupal\user\Access; -use Drupal\Core\Routing\Access\AccessInterface; +use Drupal\Core\Routing\Access\AccessBase; use Drupal\Core\Session\AccountInterface; use Symfony\Component\HttpFoundation\Request; /** * Access check for user registration routes. */ -class RegisterAccessCheck implements AccessInterface { +class RegisterAccessCheck extends AccessBase { /** * Checks access. @@ -34,8 +34,15 @@ public function access(Request $request, AccountInterface $account) { /** * {@inheritdoc} */ - public function isCacheablePerRole() { + public function isCacheable() { return TRUE; } + /** + * {@inheritdoc} + */ + public function getCacheContexts() { + return array('cache_context.user.roles'); + } + } diff --git a/core/modules/user/src/Access/RoleAccessCheck.php b/core/modules/user/src/Access/RoleAccessCheck.php index ba619f8..25afe82 100644 --- a/core/modules/user/src/Access/RoleAccessCheck.php +++ b/core/modules/user/src/Access/RoleAccessCheck.php @@ -7,7 +7,7 @@ namespace Drupal\user\Access; -use Drupal\Core\Routing\Access\AccessInterface; +use Drupal\Core\Routing\Access\AccessBase; use Drupal\Core\Session\AccountInterface; use Symfony\Component\Routing\Route; @@ -18,7 +18,7 @@ * single role, users with that role with have access. If you specify multiple * ones you can conjunct them with AND by using a "+" and with OR by using ",". */ -class RoleAccessCheck implements AccessInterface { +class RoleAccessCheck extends AccessBase { /** * Checks access. @@ -57,8 +57,15 @@ public function access(Route $route, AccountInterface $account) { /** * {@inheritdoc} */ - public function isCacheablePerRole() { + public function isCacheable() { return TRUE; } + /** + * {@inheritdoc} + */ + public function getCacheContexts() { + return array('cache_context.user.roles'); + } + } diff --git a/core/modules/views/src/ViewsAccessCheck.php b/core/modules/views/src/ViewsAccessCheck.php index b184ef2..afc32c9 100644 --- a/core/modules/views/src/ViewsAccessCheck.php +++ b/core/modules/views/src/ViewsAccessCheck.php @@ -8,6 +8,7 @@ namespace Drupal\views; use Drupal\Core\Access\AccessCheckInterface; +use Drupal\Core\Routing\Access\AccessBase; use Drupal\Core\Session\AccountInterface; use Symfony\Component\Routing\Route; @@ -16,7 +17,7 @@ * * @todo We could leverage the permission one as well? */ -class ViewsAccessCheck implements AccessCheckInterface { +class ViewsAccessCheck extends AccessBase implements AccessCheckInterface { /** * {@inheritdoc} @@ -41,8 +42,15 @@ public function access(AccountInterface $account) { /** * {@inheritdoc} */ - public function isCacheablePerRole() { + public function isCacheable() { return TRUE; } + /** + * {@inheritdoc} + */ + public function getCacheContexts() { + return array('cache_context.user.roles'); + } + }