diff --git a/core/lib/Drupal/Core/DrupalKernel.php b/core/lib/Drupal/Core/DrupalKernel.php index ed776bf551..30ea156e42 100644 --- a/core/lib/Drupal/Core/DrupalKernel.php +++ b/core/lib/Drupal/Core/DrupalKernel.php @@ -618,6 +618,20 @@ public function discoverServiceProviders() { // Retrieve enabled modules and register their namespaces. if (!isset($this->moduleList)) { $extensions = $this->getConfigStorage()->read('core.extension'); + // If core.extension configuration does not exist and we're not in the + // installer itself, then we need to put the kernel into a pre-installer + // mode. The container should not be dumped because Drupal is yet to be + // installed. The installer service provider is registered to ensure that + // cache and other automatically created tables are not created if + // database settings are available. None of this is required when the + // installer is running because the installer has its own kernel and + // manages the addition of its own service providers. + // @see \Drupal\KernelTests\KernelTestBase::bootKernel() + if ($extensions === FALSE && !InstallerKernel::installationAttempted()) { + $this->allowDumping = FALSE; + $this->containerNeedsDumping = FALSE; + $GLOBALS['conf']['container_service_providers']['InstallerServiceProvider'] = 'Drupal\Core\Installer\InstallerServiceProvider'; + } $this->moduleList = isset($extensions['module']) ? $extensions['module'] : []; } $module_filenames = $this->getModuleFileNames(); diff --git a/core/tests/Drupal/FunctionalTests/Installer/InstallerExistingSettingsTest.php b/core/tests/Drupal/FunctionalTests/Installer/InstallerExistingSettingsTest.php index f5fb5dc225..141f047a3c 100644 --- a/core/tests/Drupal/FunctionalTests/Installer/InstallerExistingSettingsTest.php +++ b/core/tests/Drupal/FunctionalTests/Installer/InstallerExistingSettingsTest.php @@ -54,6 +54,17 @@ protected function prepareEnvironment() { mkdir($this->settings['settings']['config_sync_directory']->value, 0777, TRUE); } + /** + * Visits the interactive installer. + */ + protected function visitInstaller() { + // Should redirect to the installer. + $this->drupalGet($GLOBALS['base_url']); + // Ensure no database tables have been created yet. + $this->assertSame([], Database::getConnection()->schema()->findTables('%')); + $this->assertSession()->addressEquals($GLOBALS['base_url'] . '/core/install.php'); + } + /** * {@inheritdoc} */ diff --git a/core/tests/Drupal/KernelTests/KernelTestBase.php b/core/tests/Drupal/KernelTests/KernelTestBase.php index 4539ed4850..ebb50d631d 100644 --- a/core/tests/Drupal/KernelTests/KernelTestBase.php +++ b/core/tests/Drupal/KernelTests/KernelTestBase.php @@ -340,11 +340,12 @@ private function bootKernel() { // Bootstrap the kernel. Do not use createFromRequest() to retain Settings. $kernel = new DrupalKernel('testing', $this->classLoader, FALSE); $kernel->setSitePath($this->siteDirectory); - // Boot a new one-time container from scratch. Ensure to set the module list - // upfront to avoid a subsequent rebuild. - if ($modules && $extensions = $this->getExtensionsForModules($modules)) { - $kernel->updateModules($extensions, $extensions); - } + // Boot a new one-time container from scratch. Set the module list upfront + // to avoid a subsequent rebuild or setting the kernel into the + // pre-installer mode. + $extensions = $modules ? $this->getExtensionsForModules($modules) : []; + $kernel->updateModules($extensions, $extensions); + // DrupalKernel::boot() is not sufficient as it does not invoke preHandle(), // which is required to initialize legacy global variables. $request = Request::create('/');