diff --git a/core/authorize.php b/core/authorize.php index fe39394..b11387c 100644 --- a/core/authorize.php +++ b/core/authorize.php @@ -20,6 +20,8 @@ * @link authorize Authorized operation helper functions @endlink */ +use Symfony\Component\HttpFoundation\Request; + // Change the directory to the Drupal root. chdir('..'); @@ -68,7 +70,6 @@ function authorize_access_allowed() { // We prepare only a minimal bootstrap. This includes the database and // variables, however, so we have access to the class autoloader. drupal_bootstrap(DRUPAL_BOOTSTRAP_VARIABLES); - // This must go after drupal_bootstrap(), which unsets globals! global $conf; diff --git a/core/core.services.yml b/core/core.services.yml index 6f8cce6..ed7b7ac 100644 --- a/core/core.services.yml +++ b/core/core.services.yml @@ -177,11 +177,7 @@ services: arguments: ['@container.namespaces', '@controller_resolver', '@request', '@router.route_provider', '@module_handler'] request: class: Symfony\Component\HttpFoundation\Request - # @TODO the synthetic setting must be uncommented whenever drupal_session_initialize() - # is run after there is a request and the following two lines should be removed. - factory_class: Symfony\Component\HttpFoundation\Request - factory_method: createFromGlobals - #synthetic: true + synthetic: true event_dispatcher: class: Symfony\Component\EventDispatcher\ContainerAwareEventDispatcher arguments: ['@service_container'] diff --git a/core/includes/bootstrap.inc b/core/includes/bootstrap.inc index 481adea..ba4528c 100644 --- a/core/includes/bootstrap.inc +++ b/core/includes/bootstrap.inc @@ -1574,7 +1574,7 @@ function watchdog($type, $message, array $variables = NULL, $severity = WATCHDOG $log_entry['referer'] = $request->headers->get('Referer', ''); $log_entry['ip'] = $request->getClientIP(); } - catch (\InvalidArgumentException $e) { + catch (DependencyInjectionRuntimeException $e) { // We are not in a request context. } @@ -1739,9 +1739,17 @@ function drupal_set_title($title = NULL, $output = CHECK_PLAIN) { * The user session object. */ function drupal_anonymous_user() { + try { + $request = Drupal::request(); + $hostname = $request->getClientIP(); + } + catch (DependencyInjectionRuntimeException $e) { + // We are not in a request context. + $hostname = ''; + } $values = array( 'uid' => 0, - 'hostname' => Drupal::request()->getClientIP(), + 'hostname' => $hostname, 'roles' => array(DRUPAL_ANONYMOUS_RID), ); return new UserSession($values); @@ -1883,10 +1891,13 @@ function drupal_handle_request($test_only = FALSE) { // @todo Remove this once everything in the bootstrap has been // converted to services in the DIC. $kernel->boot(); - drupal_bootstrap(DRUPAL_BOOTSTRAP_CODE); // Create a request object from the HttpFoundation. $request = Request::createFromGlobals(); + Drupal::getContainer()->set('request', $request); + + drupal_bootstrap(DRUPAL_BOOTSTRAP_CODE); + $response = $kernel->handle($request)->prepare($request)->send(); $kernel->terminate($request, $response); @@ -2016,6 +2027,8 @@ function _drupal_bootstrap_kernel() { if (!Drupal::getContainer()) { $kernel = new DrupalKernel('prod', drupal_classloader()); $kernel->boot(); + $request = Request::createFromGlobals(); + Drupal::getContainer()->set('request', $request); } } diff --git a/core/includes/install.inc b/core/includes/install.inc index 8acddc2..dace078 100644 --- a/core/includes/install.inc +++ b/core/includes/install.inc @@ -617,10 +617,19 @@ function drupal_install_system() { // Create tables. drupal_install_schema('system'); - if (!drupal_container()->has('kernel')) { - // Immediately boot a kernel to have real services ready. + if (!Drupal::getContainer()->has('kernel')) { + // Immediately boot a kernel to have real services ready. If there's already + // an initialized request object in the pre-kernel container, persist it in + // the post-kernel container. + if (Drupal::getContainer()->initialized('request')) { + $request = Drupal::request(); + } $kernel = new DrupalKernel('install', drupal_classloader(), FALSE); $kernel->boot(); + if (isset($request)) { + Drupal::getContainer()->set('request', $request); + } + } $system_path = drupal_get_path('module', 'system'); diff --git a/core/lib/Drupal/Core/DrupalKernel.php b/core/lib/Drupal/Core/DrupalKernel.php index af1fe52..f0d2566 100644 --- a/core/lib/Drupal/Core/DrupalKernel.php +++ b/core/lib/Drupal/Core/DrupalKernel.php @@ -382,10 +382,17 @@ protected function getKernelParameters() { */ protected function initializeContainer() { $persist = $this->getServicesToPersist(); - // If we are rebuilding the kernel and we are in a request scope, store - // request info so we can add them back after the rebuild. - if (isset($this->container) && $this->container->hasScope('request')) { - $request = $this->container->get('request'); + // The request service requires custom persisting logic, since it is also + // potentially scoped. During Drupal installation, there is a request + // service without a request scope. + $request_scope = FALSE; + if (isset($this->container)) { + if ($this->container->hasScope('request') && $this->container->isScopeActive('request')) { + $request_scope = TRUE; + } + if ($this->container->initialized('request')) { + $request = $this->container->get('request'); + } } $this->container = NULL; $class = $this->getClassName(); @@ -458,8 +465,10 @@ protected function initializeContainer() { // Set the class loader which was registered as a synthetic service. $this->container->set('class_loader', $this->classLoader); // If we have a request set it back to the new container. - if (isset($request)) { + if ($request_scope) { $this->container->enterScope('request'); + } + if (isset($request)) { $this->container->set('request', $request); } \Drupal::setContainer($this->container); diff --git a/core/modules/simpletest/lib/Drupal/simpletest/DrupalUnitTestBase.php b/core/modules/simpletest/lib/Drupal/simpletest/DrupalUnitTestBase.php index 54305c0..a4050ba 100644 --- a/core/modules/simpletest/lib/Drupal/simpletest/DrupalUnitTestBase.php +++ b/core/modules/simpletest/lib/Drupal/simpletest/DrupalUnitTestBase.php @@ -13,6 +13,7 @@ use Symfony\Component\DependencyInjection\Reference; use Drupal\Core\Database\Database; use Symfony\Component\DependencyInjection\ContainerInterface; +use Symfony\Component\HttpFoundation\Request; /** * Base test case class for Drupal unit tests. @@ -183,7 +184,8 @@ public function containerBuild(ContainerBuilder $container) { $definition = $container->getDefinition('path_processor_alias'); $definition->clearTag('path_processor_inbound')->clearTag('path_processor_outbound'); } - + $request = Request::create('/'); + $this->container->set('request', $request); } /** diff --git a/core/modules/simpletest/lib/Drupal/simpletest/TestBase.php b/core/modules/simpletest/lib/Drupal/simpletest/TestBase.php index 4040625..fa6f0d1 100644 --- a/core/modules/simpletest/lib/Drupal/simpletest/TestBase.php +++ b/core/modules/simpletest/lib/Drupal/simpletest/TestBase.php @@ -19,6 +19,7 @@ use Drupal\Core\Language\Language; use ReflectionMethod; use ReflectionObject; +use Symfony\Component\HttpFoundation\Request; /** * Base class for Drupal tests. @@ -934,7 +935,9 @@ protected function prepareEnvironment() { $this->container = new ContainerBuilder(); // @todo Remove this once this class has no calls to t() and format_plural() $this->container->register('string_translation', 'Drupal\Core\StringTranslation\TranslationManager'); - + $request = Request::create('/'); + $request->attributes->set('_account', $GLOBALS['user']); + $this->container->set('request', $request); \Drupal::setContainer($this->container); // Unset globals. @@ -1002,7 +1005,7 @@ protected function rebuildContainer() { // DrupalKernel replaces the container in Drupal::getContainer() with a // different object, so we need to replace the instance on this test class. $this->container = \Drupal::getContainer(); - // The global $user is set in TestBase::prepareEnvironment(). + // Assign User object initialized in TestBase::prepareEnvironment(). $this->container->get('request')->attributes->set('_account', $GLOBALS['user']); } diff --git a/core/modules/views/lib/Drupal/views/Plugin/views/display/DisplayPluginBase.php b/core/modules/views/lib/Drupal/views/Plugin/views/display/DisplayPluginBase.php index 4d04243..af0bee7 100644 --- a/core/modules/views/lib/Drupal/views/Plugin/views/display/DisplayPluginBase.php +++ b/core/modules/views/lib/Drupal/views/Plugin/views/display/DisplayPluginBase.php @@ -12,6 +12,7 @@ use Drupal\views\ViewExecutable; use \Drupal\views\Plugin\views\PluginBase; use Drupal\views\Views; +use Symfony\Component\DependencyInjection\Exception\RuntimeException as DependencyInjectionRuntimeException; /** * @defgroup views_display_plugins Views display plugins @@ -884,8 +885,15 @@ public function getHandlers($type) { // If this is during form submission and there are temporary options // which can only appear if the view is in the edit cache, use those // options instead. This is used for AJAX multi-step stuff. - if (\Drupal::request()->request->get('form_id') && isset($this->view->temporary_options[$type][$id])) { - $info = $this->view->temporary_options[$type][$id]; + // @todo Remove dependency on Request object + // https://drupal.org/node/2059003 + try { + $request = \Drupal::request(); + if ($request->get('form_id') && isset($this->view->temporary_options[$type][$id])) { + $info = $this->view->temporary_options[$type][$id]; + } + } + catch (DependencyInjectionRuntimeException $e) { } if ($info['id'] != $id) { diff --git a/core/scripts/run-tests.sh b/core/scripts/run-tests.sh index 49b1a44..15b3325 100755 --- a/core/scripts/run-tests.sh +++ b/core/scripts/run-tests.sh @@ -30,6 +30,10 @@ // Bootstrap to perform initial validation or other operations. drupal_bootstrap(DRUPAL_BOOTSTRAP_CODE); simpletest_classloader_register(); +// We have to add a Request. +$request = \Symfony\Component\HttpFoundation\Request::createFromGlobals(); +$container = Drupal::getContainer(); +$container->set('request', $request); if (!module_exists('simpletest')) { simpletest_script_print_error("The simpletest module must be enabled before this script can run."); @@ -472,8 +476,11 @@ function simpletest_script_run_one_test($test_id, $test_class) { try { // Bootstrap Drupal. drupal_bootstrap(DRUPAL_BOOTSTRAP_CODE); - simpletest_classloader_register(); + // We have to add a Request. + $request = \Symfony\Component\HttpFoundation\Request::createFromGlobals(); + $container = Drupal::getContainer(); + $container->set('request', $request); // Override configuration according to command line parameters. $conf['simpletest.settings']['verbose'] = $args['verbose']; diff --git a/core/update.php b/core/update.php index 3052584..b883d46 100644 --- a/core/update.php +++ b/core/update.php @@ -446,15 +446,12 @@ function update_check_requirements($skip_warnings = FALSE) { // Determine if the current user has access to run update.php. drupal_bootstrap(DRUPAL_BOOTSTRAP_VARIABLES); -require_once DRUPAL_ROOT . '/' . settings()->get('session_inc', 'core/includes/session.inc'); -drupal_session_initialize(); - // A request object from the HTTPFoundation to tell us about the request. -// @todo These two lines were copied from index.php which has its own todo about -// a change required here. Revisit this when that change has been made. $request = Request::createFromGlobals(); -drupal_container() - ->set('request', $request); +Drupal::getContainer()->set('request', $request); + +require_once DRUPAL_ROOT . '/' . settings()->get('session_inc', 'core/includes/session.inc'); +drupal_session_initialize(); // Ensure that URLs generated for the home and admin pages don't have 'update.php' // in them.