Skip to content
Snippets Groups Projects
Commit b5e3cc53 authored by catch's avatar catch
Browse files

Revert "Issue #2913912 by alexpott, phenaproxima: URL generator may have a...

Revert "Issue #2913912 by alexpott, phenaproxima: URL generator may have a stale route provider during module installation"

This reverts commit 391b7103.
parent 61df34e0
Branches
Tags
2 merge requests!7452Issue #1797438. HTML5 validation is preventing form submit and not fully...,!789Issue #3210310: Adjust Database API to remove deprecated Drupal 9 code in Drupal 10
......@@ -194,17 +194,6 @@ public function install(array $module_list, $enable_dependencies = TRUE) {
// Update the kernel to include it.
$this->updateKernel($module_filenames);
// Replace the route provider service with a version that will rebuild
// if routes used during installation. This ensures that a module's
// routes are available during installation. This has to occur before
// any services that depend on the it are instantiated otherwise those
// services will have the old route provider injected. Note that, since
// the container is rebuilt by updating the kernel, the route provider
// service is the regular one even though we are in a loop and might
// have replaced it before.
\Drupal::getContainer()->set('router.route_provider.old', \Drupal::service('router.route_provider'));
\Drupal::getContainer()->set('router.route_provider', \Drupal::service('router.route_provider.lazy_builder'));
// Allow modules to react prior to the installation of a module.
$this->moduleHandler->invokeAll('module_preinstall', [$module]);
......@@ -294,6 +283,10 @@ public function install(array $module_list, $enable_dependencies = TRUE) {
// @see https://www.drupal.org/node/2208429
\Drupal::service('theme_handler')->refreshInfo();
// In order to make uninstalling transactional if anything uses routes.
\Drupal::getContainer()->set('router.route_provider.old', \Drupal::service('router.route_provider'));
\Drupal::getContainer()->set('router.route_provider', \Drupal::service('router.route_provider.lazy_builder'));
// Allow the module to perform install tasks.
$this->moduleHandler->invoke($module, 'install');
......
name: 'Lazy route provider install test'
description: 'Helps test a bug triggered by the url_generator maintaining a stale route provider.'
type: module
package: Testing
version: VERSION
core: 8.x
services:
plugin.manager.lazy_route_provider_install_test:
class: '\Drupal\lazy_route_provider_install_test\PluginManager'
parent: default_plugin_manager
arguments: ['@url_generator']
<?php
namespace Drupal\lazy_route_provider_install_test;
use Drupal\Component\Annotation\PluginID;
use Drupal\Core\Cache\CacheBackendInterface;
use Drupal\Core\Extension\ModuleHandlerInterface;
use Drupal\Core\Plugin\DefaultPluginManager;
use Drupal\Core\Routing\UrlGeneratorInterface;
use Drupal\Core\Url;
class PluginManager extends DefaultPluginManager {
/**
* PluginManager constructor.
*
* This plugin manager depends on the URL generator to ensure that this
* service is instantiated during module installation when the plugin caches
* are cleared.
*
* @param \Traversable $namespaces
* An object that implements \Traversable which contains the root paths
* keyed by the corresponding namespace to look for plugin implementations.
* @param \Drupal\Core\Cache\CacheBackendInterface $cache_backend
* A cache backend.
* @param \Drupal\Core\Extension\ModuleHandlerInterface $module_handler
* The module handler.
* @param \Drupal\Core\Routing\UrlGeneratorInterface $url_generator
* The URL generator.
*/
public function __construct(\Traversable $namespaces, CacheBackendInterface $cache_backend, ModuleHandlerInterface $module_handler, UrlGeneratorInterface $url_generator) {
// Generate a URL during construction to prove that URL generation works. If
// the route was missing an exception would be thrown. This also forces the
// route provider to be initialized very early during a module install.
\Drupal::state()->set(__CLASS__, Url::fromRoute('system.admin')->toString());
parent::__construct('Plugin/LazyRouteProviderInstallTest', $namespaces, $module_handler, NULL, PluginID::class);
}
}
<?php
/**
* @file
* Install, update and uninstall functions for the router_test module.
*/
use Drupal\Core\Url;
/**
* Implements hook_install().
*/
function router_test_install() {
// Ensure a URL can be generated for routes provided by the module during
// installation.
\Drupal::state()->set(__FUNCTION__, Url::fromRoute('router_test.1')->toString());
}
<?php
namespace Drupal\FunctionalTests\Routing;
use Drupal\Tests\BrowserTestBase;
/**
* @group routing
*/
class LazyRouteProviderInstallTest extends BrowserTestBase {
/**
* {@inheritdoc}
*/
protected static $modules = ['lazy_route_provider_install_test'];
/**
* Tests that the lazy route provider is used during a module install.
*/
public function testInstallation() {
$this->container->get('module_installer')->install(['router_test']);
// Note that on DrupalCI the test site is installed in a sub directory so
// we cannot use ::assertEquals().
$this->assertStringEndsWith('/admin', \Drupal::state()->get('Drupal\lazy_route_provider_install_test\PluginManager'));
$this->assertStringEndsWith('/router_test/test1', \Drupal::state()->get('router_test_install'));
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment