X-Git-Url: http://www.aleph1.co.uk/gitweb/?p=yaffs-website;a=blobdiff_plain;f=web%2Fcore%2Flib%2FDrupal%2FCore%2FRouting%2FRouteProviderLazyBuilder.php;fp=web%2Fcore%2Flib%2FDrupal%2FCore%2FRouting%2FRouteProviderLazyBuilder.php;h=a2cb8c57851330c28545bd05fa136b6f36d52bf1;hp=8c59900c82ff38b5f9deed5f97b50ffafd63e922;hb=9917807b03b64faf00f6a1f29dcb6eafc454efa5;hpb=aea91e65e895364e460983b890e295aa5d5540a5 diff --git a/web/core/lib/Drupal/Core/Routing/RouteProviderLazyBuilder.php b/web/core/lib/Drupal/Core/Routing/RouteProviderLazyBuilder.php index 8c59900c8..a2cb8c578 100644 --- a/web/core/lib/Drupal/Core/Routing/RouteProviderLazyBuilder.php +++ b/web/core/lib/Drupal/Core/Routing/RouteProviderLazyBuilder.php @@ -3,12 +3,13 @@ namespace Drupal\Core\Routing; use Symfony\Cmf\Component\Routing\PagedRouteProviderInterface; +use Symfony\Component\EventDispatcher\EventSubscriberInterface; use Symfony\Component\HttpFoundation\Request; /** * A Route Provider front-end for all Drupal-stored routes. */ -class RouteProviderLazyBuilder implements PreloadableRouteProviderInterface, PagedRouteProviderInterface { +class RouteProviderLazyBuilder implements PreloadableRouteProviderInterface, PagedRouteProviderInterface, EventSubscriberInterface { /** * The route provider service. @@ -31,6 +32,18 @@ class RouteProviderLazyBuilder implements PreloadableRouteProviderInterface, Pag */ protected $rebuilt = FALSE; + /** + * Flag to determine if router is currently being rebuilt. + * + * Used to prevent recursive router rebuilds during module installation. + * Recursive rebuilds can occur when route information is required by alter + * hooks that are triggered during a rebuild, for example, + * hook_menu_links_discovered_alter(). + * + * @var bool + */ + protected $rebuilding = FALSE; + /** * RouteProviderLazyBuilder constructor. * @@ -51,7 +64,7 @@ class RouteProviderLazyBuilder implements PreloadableRouteProviderInterface, Pag * The route provider service. */ protected function getRouteProvider() { - if (!$this->rebuilt) { + if (!$this->rebuilt && !$this->rebuilding) { $this->routeBuilder->rebuild(); $this->rebuilt = TRUE; } @@ -132,4 +145,27 @@ class RouteProviderLazyBuilder implements PreloadableRouteProviderInterface, Pag return $this->rebuilt; } + /** + * {@inheritdoc} + */ + public static function getSubscribedEvents() { + $events[RoutingEvents::DYNAMIC][] = ['routerRebuilding', 3000]; + $events[RoutingEvents::FINISHED][] = ['routerRebuildFinished', -3000]; + return $events; + } + + /** + * Sets the router rebuilding flag to TRUE. + */ + public function routerRebuilding() { + $this->rebuilding = TRUE; + } + + /** + * Sets the router rebuilding flag to FALSE. + */ + public function routerRebuildFinished() { + $this->rebuilding = FALSE; + } + }