diff core/lib/Drupal/Core/EventSubscriber/MenuRouterRebuildSubscriber.php @ 0:4c8ae668cc8c

Initial import (non-working)
author Chris Cannam
date Wed, 29 Nov 2017 16:09:58 +0000
parents
children af1871eacc83
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/core/lib/Drupal/Core/EventSubscriber/MenuRouterRebuildSubscriber.php	Wed Nov 29 16:09:58 2017 +0000
@@ -0,0 +1,89 @@
+<?php
+
+namespace Drupal\Core\EventSubscriber;
+
+use Drupal\Core\Cache\Cache;
+use Drupal\Core\Lock\LockBackendInterface;
+use Drupal\Core\Menu\MenuLinkManagerInterface;
+use Drupal\Core\Routing\RoutingEvents;
+use Symfony\Component\EventDispatcher\Event;
+use Symfony\Component\EventDispatcher\EventSubscriberInterface;
+
+/**
+ * Rebuilds the default menu links and runs menu-specific code if necessary.
+ */
+class MenuRouterRebuildSubscriber implements EventSubscriberInterface {
+
+  /**
+   * @var \Drupal\Core\Lock\LockBackendInterface
+   */
+  protected $lock;
+
+  /**
+   * The menu link plugin manager.
+   *
+   * @var \Drupal\Core\Menu\MenuLinkManagerInterface
+   */
+  protected $menuLinkManager;
+
+  /**
+   * Constructs the MenuRouterRebuildSubscriber object.
+   *
+   * @param \Drupal\Core\Lock\LockBackendInterface $lock
+   *   The lock backend.
+   * @param \Drupal\Core\Menu\MenuLinkManagerInterface $menu_link_manager
+   *   The menu link plugin manager.
+   */
+  public function __construct(LockBackendInterface $lock, MenuLinkManagerInterface $menu_link_manager) {
+    $this->lock = $lock;
+    $this->menuLinkManager = $menu_link_manager;
+  }
+
+  /**
+   * Rebuilds the menu links and deletes the local_task cache tag.
+   *
+   * @param \Symfony\Component\EventDispatcher\Event $event
+   *   The event object.
+   */
+  public function onRouterRebuild(Event $event) {
+    $this->menuLinksRebuild();
+    Cache::invalidateTags(['local_task']);
+  }
+
+  /**
+   * Perform menu-specific rebuilding.
+   */
+  protected function menuLinksRebuild() {
+    if ($this->lock->acquire(__FUNCTION__)) {
+      $transaction = db_transaction();
+      try {
+        // Ensure the menu links are up to date.
+        $this->menuLinkManager->rebuild();
+        // Ignore any database replicas temporarily.
+        db_ignore_replica();
+      }
+      catch (\Exception $e) {
+        $transaction->rollBack();
+        watchdog_exception('menu', $e);
+      }
+
+      $this->lock->release(__FUNCTION__);
+    }
+    else {
+      // Wait for another request that is already doing this work.
+      // We choose to block here since otherwise the router item may not
+      // be available during routing resulting in a 404.
+      $this->lock->wait(__FUNCTION__);
+    }
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function getSubscribedEvents() {
+    // Run after CachedRouteRebuildSubscriber.
+    $events[RoutingEvents::FINISHED][] = ['onRouterRebuild', 100];
+    return $events;
+  }
+
+}