We're currently stuffing a lot of information into request attributes, here's some of them:
core/includes/common.inc: 'path' => $request->attributes->get('_system_path'),
core/includes/common.inc~: 'path' => $request->attributes->get('_system_path'),
core/includes/menu.inc: $map[$index] = $request->attributes->get($matches['placeholder']);
core/includes/menu.inc: $path = $request->attributes->get(RouteObjectInterface::ROUTE_OBJECT)->getPath();
core/includes/menu.inc: if ($route_name = $request->attributes->get(RouteObjectInterface::ROUTE_NAME)) {
core/includes/menu.inc: $system_path = $request->attributes->get('_system_path');
core/lib/Drupal/Core/Access/CsrfTokenGenerator.php: $user = $this->request->attributes->get('_account');
core/lib/Drupal/Core/Authentication/AuthenticationManager.php: $route = $request->attributes->get(RouteObjectInterface::ROUTE_OBJECT);
core/lib/Drupal/Core/Controller/ControllerResolver.php: if (!$controller = $request->attributes->get('_controller')) {
core/lib/Drupal/Core/Controller/ControllerResolver.php: if ($request->attributes->has('_raw_variables') && $raw = $request->attributes->get('_raw_variables')->all()) {
core/lib/Drupal/Core/Controller/ControllerResolverInterface.php: * The controller attribute like in $request->attributes->get('_controller')
core/lib/Drupal/Core/Controller/DialogController.php: $route_name = $request->attributes->get(RouteObjectInterface::ROUTE_NAME);
core/lib/Drupal/Core/Controller/ExceptionController.php: $system_path = $request->attributes->get('_system_path');
core/lib/Drupal/Core/Controller/ExceptionController.php: watchdog('page not found', check_plain($request->attributes->get('_system_path')), NULL, WATCHDOG_WARNING);
core/lib/Drupal/Core/Controller/ExceptionController.php: $system_path = $request->attributes->get('_system_path');
core/lib/Drupal/Core/Controller/HtmlPageController.php: $title = $this->titleResolver->getTitle($request, $request->attributes->get(RouteObjectInterface::ROUTE_OBJECT));
core/lib/Drupal/Core/Entity/EntityAccessCheck.php: $entity = $request->attributes->get($entity_type);
core/lib/Drupal/Core/Entity/HtmlEntityFormController.php: $entity = $request->attributes->get($entity_type);
core/lib/Drupal/Core/EventSubscriber/AccessSubscriber.php: $access = $this->accessManager->check($request->attributes->get(RouteObjectInterface::ROUTE_OBJECT), $request, $this->currentUser);
core/lib/Drupal/Core/EventSubscriber/MaintenanceModeSubscriber.php: if ($request->attributes->get('_maintenance') != MENU_SITE_ONLINE && !($response instanceof RedirectResponse)) {
core/lib/Drupal/Core/EventSubscriber/PathListenerBase.php: $path = $request->attributes->get('_system_path');
core/lib/Drupal/Core/EventSubscriber/ViewSubscriber.php: elseif ($request->attributes->get('_legacy')) {
core/lib/Drupal/Core/EventSubscriber/ViewSubscriber.php: $page_result['#title'] = $this->titleResolver->getTitle($request, $request->attributes->get(RouteObjectInterface::ROUTE_OBJECT));
core/lib/Drupal/Core/EventSubscriber/ViewSubscriber.php: $page_result['#title'] = $this->titleResolver->getTitle($request, $request->attributes->get(RouteObjectInterface::ROUTE_OBJECT));
core/lib/Drupal/Core/EventSubscriber/ViewSubscriber.php: $page_callback_result['#title'] = $this->titleResolver->getTitle($request, $request->attributes->get(RouteObjectInterface::ROUTE_OBJECT));
core/lib/Drupal/Core/Form/FormBuilder.php: $path = $this->request->attributes->get('_system_path');
core/lib/Drupal/Core/Form/FormBuilder.php: $url = $this->urlGenerator->generateFromPath($this->request->attributes->get('_system_path'), array(
core/lib/Drupal/Core/Menu/LocalActionDefault.php: $raw_variables = $request->attributes->get('_raw_variables');
core/lib/Drupal/Core/Menu/LocalActionDefault.php: $parameters[$name] = $request->attributes->get($name);
core/lib/Drupal/Core/Menu/LocalTaskDefault.php: $raw_variables = $request->attributes->get('_raw_variables');
core/lib/Drupal/Core/Menu/LocalTaskDefault.php: $parameters[$name] = $request->attributes->get($name);
core/lib/Drupal/Core/Menu/LocalTaskManager.php: $raw_variables_bag = $this->request->attributes->get('_raw_variables');
core/lib/Drupal/Core/Routing/Enhancer/AuthenticationEnhancer.php: $auth_provider_triggered = $request->attributes->get('_authentication_provider');
core/lib/Drupal/Core/Routing/Enhancer/ContentControllerEnhancer.php: if ($request->attributes->get('dialog') && !empty($defaults['_content'])) {
core/lib/Drupal/Core/Routing/RouteProvider.php: $path = '/' . $request->attributes->get('_system_path');
core/lib/Drupal/Core/Routing/UrlMatcher.php: return $this->match('/' . $request->attributes->get('_system_path'));
core/lib/Drupal/Core/Theme/ThemeAccessCheck.php: return $this->checkAccess($request->attributes->get('theme')) ? static::ALLOW : static::DENY;
core/lib/Drupal/Core/Utility/LinkGenerator.php: $raw_variables = $request->attributes->get('_raw_variables');
core/lib/Drupal/Core/Utility/LinkGenerator.php: 'route_name' => $request->attributes->get(RouteObjectInterface::ROUTE_NAME),
core/modules/block/custom_block/lib/Drupal/custom_block/Plugin/Menu/LocalAction/CustomBlockAddLocalAction.php: $options['query']['theme'] = $request->attributes->get('theme');
core/modules/book/lib/Drupal/book/Access/BookNodeIsRemovableAccessCheck.php: $node = $request->attributes->get('node');
core/modules/comment/comment.module: $form['#title'] = \Drupal::service('comment.manager')->getFieldUIPageTitle($request->attributes->get('commented_entity_type'), $request->attributes->get('field_name'));
core/modules/comment/comment.module: $form['#title'] = \Drupal::service('comment.manager')->getFieldUIPageTitle($request->attributes->get('commented_entity_type'), $request->attributes->get('field_name'));
core/modules/comment/comment.module: $form['#title'] = \Drupal::service('comment.manager')->getFieldUIPageTitle($request->attributes->get('commented_entity_type'), $request->attributes->get('field_name'));
core/modules/contact/lib/Drupal/contact/Access/ContactPageAccess.php: $contact_account = $request->attributes->get('user');
core/modules/content_translation/lib/Drupal/content_translation/Access/ContentTranslationManageAccessCheck.php: $entity_type = $request->attributes->get('_entity_type');
core/modules/content_translation/lib/Drupal/content_translation/Access/ContentTranslationManageAccessCheck.php: if ($entity = $request->attributes->get($entity_type)) {
core/modules/content_translation/lib/Drupal/content_translation/Access/ContentTranslationManageAccessCheck.php: $source = language_load($request->attributes->get('source'));
core/modules/content_translation/lib/Drupal/content_translation/Access/ContentTranslationManageAccessCheck.php: $target = language_load($request->attributes->get('target'));
core/modules/content_translation/lib/Drupal/content_translation/Access/ContentTranslationManageAccessCheck.php: $language = language_load($request->attributes->get('language'));
core/modules/content_translation/lib/Drupal/content_translation/Access/ContentTranslationOverviewAccess.php: $entity_type = $request->attributes->get('_entity_type');
core/modules/content_translation/lib/Drupal/content_translation/Access/ContentTranslationOverviewAccess.php: if ($entity = $request->attributes->get($entity_type)) {
core/modules/content_translation/lib/Drupal/content_translation/Controller/ContentTranslationController.php: $entity = $request->attributes->get($request->attributes->get('_entity_type'));
core/modules/content_translation/lib/Drupal/content_translation/Controller/ContentTranslationController.php: $entity = $request->attributes->get($request->attributes->get('_entity_type'));
core/modules/content_translation/lib/Drupal/content_translation/Controller/ContentTranslationController.php: $entity = $request->attributes->get($request->attributes->get('_entity_type'));
core/modules/content_translation/lib/Drupal/content_translation/Form/ContentTranslationForm.php: $entity = $request->attributes->get($request->attributes->get('_entity_type'));
core/modules/edit/lib/Drupal/edit/Access/EditEntityAccessCheck.php: return $this->accessEditEntity($request->attributes->get('entity'), $account) ? static::ALLOW : static::DENY;
core/modules/edit/lib/Drupal/edit/Access/EditEntityAccessCheck.php: if (!is_object($entity = $request->attributes->get('entity'))) {
core/modules/edit/lib/Drupal/edit/Access/EditEntityAccessCheck.php: $entity_type = $request->attributes->get('entity_type');
core/modules/edit/lib/Drupal/edit/Access/EditEntityFieldAccessCheck.php: return $this->accessEditEntityField($request->attributes->get('entity'), $request->attributes->get('field_name')) ? static::ALLOW : static::DENY;
core/modules/edit/lib/Drupal/edit/Access/EditEntityFieldAccessCheck.php: if (!is_object($entity = $request->attributes->get('entity'))) {
core/modules/edit/lib/Drupal/edit/Access/EditEntityFieldAccessCheck.php: $entity_type = $request->attributes->get('entity_type');
core/modules/edit/lib/Drupal/edit/Access/EditEntityFieldAccessCheck.php: $field_name = $request->attributes->get('field_name');
core/modules/edit/lib/Drupal/edit/Access/EditEntityFieldAccessCheck.php: $langcode = $request->attributes->get('langcode');
core/modules/field_ui/lib/Drupal/field_ui/Access/FormModeAccessCheck.php: $bundle = $request->attributes->get('bundle');
core/modules/field_ui/lib/Drupal/field_ui/Access/FormModeAccessCheck.php: $form_mode = $request->attributes->get('mode');
c
core/modules/field_ui/lib/Drupal/field_ui/Access/ViewModeAccessCheck.php: $bundle = $request->attributes->get('bundle');
core/modules/field_ui/lib/Drupal/field_ui/Access/ViewModeAccessCheck.php: $view_mode = $request->attributes->get('mode');
core/modules/filter/lib/Drupal/filter/Access/FormatDisableCheck.php: $format = $request->attributes->get('filter_format');
core/modules/forum/forum.module: $forum_term = $request->attributes->get('taxonomy_term');
core/modules/image/lib/Drupal/image/Entity/ImageStyle.php: $clean_urls = $request->attributes->get('clean_urls');
core/modules/node/lib/Drupal/node/Access/NodeAddAccessCheck.php: return $access_controller->createAccess($request->attributes->get('node_type')->type, $account) ? static::ALLOW : static::DENY;
core/modules/node/lib/Drupal/node/Access/NodeRevisionAccessCheck.php: $node = $this->nodeStorage->loadRevision($request->attributes->get('node_revision'));
core/modules/node/lib/Drupal/node/Access/NodeRevisionAccessCheck.php: $node = $request->attributes->get('node');
core/modules/overlay/lib/Drupal/overlay/Controller/OverlayController.php: $token = $request->attributes->get('token');
core/modules/overlay/lib/Drupal/overlay/EventSubscriber/OverlaySubscriber.php: $current_path = $request->attributes->get('_system_path');
core/modules/rest/lib/Drupal/rest/RequestHandler.php: $plugin = $request->attributes->get(RouteObjectInterface::ROUTE_OBJECT)->getDefault('_plugin');
core/modules/rest/lib/Drupal/rest/RequestHandler.php: $format = $request->attributes->get(RouteObjectInterface::ROUTE_OBJECT)->getRequirement('_format') ?: 'hal_json';
core/modules/shortcut/lib/Drupal/shortcut/Access/LinkAccessCheck.php: $menu_link = $request->attributes->get('menu_link');
core/modules/shortcut/lib/Drupal/shortcut/Access/ShortcutSetEditAccessCheck.php: $shortcut_set = $request->attributes->get('shortcut_set');
core/modules/shortcut/lib/Drupal/shortcut/Access/ShortcutSetSwitchAccessCheck.php: $user = $request->attributes->get('account');
core/modules/system/lib/Drupal/system/Access/CronAccessCheck.php: $key = $request->attributes->get('key');
core/modules/system/lib/Drupal/system/PathBasedBreadcrumbBuilder.php: if (!$route_request->attributes->get('_legacy')) {
core/modules/system/lib/Drupal/system/PathBasedBreadcrumbBuilder.php: $route_name = $route_request->attributes->get(RouteObjectInterface::ROUTE_NAME);
core/modules/system/lib/Drupal/system/PathBasedBreadcrumbBuilder.php: $title = $this->titleResolver->getTitle($route_request, $route_request->attributes->get(RouteObjectInterface::ROUTE_OBJECT));
core/modules/system/lib/Drupal/system/PathBasedBreadcrumbBuilder.php: $links[] = l($title, $route_request->attributes->get('_system_path'));
core/modules/system/lib/Drupal/system/Plugin/Block/SystemHelpBlock.php: $arg = drupal_help_arg(explode('/', $request->attributes->get('_system_path')));
core/modules/system/system.module: $path = $request->attributes->get('_system_path');
core/modules/system/system.module~: $path = $request->attributes->get('_system_path');
core/modules/system/tests/modules/entity_test/lib/Drupal/entity_test/Controller/EntityTestController.php: $entity = $request->attributes->get($request->attributes->get('_entity_type'));
core/modules/system/tests/modules/menu_test/lib/Drupal/menu_test/EventSubscriber/MaintenanceModeSubscriber.php: if ($request->attributes->get('_maintenance') == MENU_SITE_OFFLINE && $request->attributes->get('_system_path') == 'menu_login_callback') {
core/modules/system/tests/modules/paramconverter_test/lib/Drupal/paramconverter_test/TestControllers.php: $foo = $request->attributes->get('foo');
core/modules/system/tests/modules/theme_test/lib/Drupal/theme_test/EventSubscriber/ThemeTestSubscriber.php: $current_path = $request->attributes->get('_system_path');
core/modules/taxonomy/taxonomy.module: $page_term = $request->attributes->get('taxonomy_term');
core/modules/tracker/lib/Drupal/tracker/Access/ViewOwnTrackerAccessCheck.php: $user = $request->attributes->get('user');
core/modules/user/lib/Drupal/user/EventSubscriber/MaintenanceModeSubscriber.php: $site_status = $request->attributes->get('_maintenance');
core/modules/user/lib/Drupal/user/EventSubscriber/MaintenanceModeSubscriber.php: $path = $request->attributes->get('_system_path');
core/modules/user/lib/Drupal/user/Plugin/Search/UserSearch.php: $user_account = $this->request->attributes->get('_account');
core/modules/views/lib/Drupal/views/Plugin/views/argument_default/Raw.php: $path = $this->request->attributes->get('_system_path');
core/modules/views/lib/Drupal/views/Routing/ViewPageController.php: $view_id = $request->attributes->get('view_id');
core/modules/views/lib/Drupal/views/Routing/ViewPageController.php: $display_id = $request->attributes->get('display_id');
core/modules/views/lib/Drupal/views/Routing/ViewPageController.php: $arg = $request->attributes->get('arg_' . $argument_id);
core/tests/Drupal/Tests/Core/HttpKernelTest.php: $this->assertEquals($subrequest->attributes->get('custom_attribute'), $random_attribute, 'Attributes are set from the subrequest.');
core/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/RequestMatcher.php: if (!preg_match('{'.$pattern.'}', $request->attributes->get($key))) {
core/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/EventListener/LocaleListener.php: if ($locale = $request->attributes->get('_locale')) {
core/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Tests/EventListener/FragmentListenerTest.php: $this->assertEquals(array('foo' => 'bar', '_controller' => 'foo'), $request->attributes->get('_route_params'));
There's several problems with this.
1. It leads to bugs like the ones that #2062151: Create a current user service to ensure that current account is always available fixes - i.e. when a new request is created it can 'lose' some attributes, or alternatively some attributes might be incorrectly copied over.
2. it's a giant array where in some cases it's the recommended way to get that information, and in others it's being used as storage for other services to save them having their own class properties.
3. All of this is accessed by magic strings, there's no real documentation about what's in there except for dumping the array.
So.. I think we should move everything custom in there to class properties on dedicated services. That way we know what is and isn't accessible and there aren't two ways of getting at it.