annotate core/lib/Drupal/Core/EventSubscriber/MenuRouterRebuildSubscriber.php @ 14:1fec387a4317

Update Drupal core to 8.5.2 via Composer
author Chris Cannam
date Mon, 23 Apr 2018 09:46:53 +0100
parents 4c8ae668cc8c
children af1871eacc83
rev   line source
Chris@0 1 <?php
Chris@0 2
Chris@0 3 namespace Drupal\Core\EventSubscriber;
Chris@0 4
Chris@0 5 use Drupal\Core\Cache\Cache;
Chris@0 6 use Drupal\Core\Lock\LockBackendInterface;
Chris@0 7 use Drupal\Core\Menu\MenuLinkManagerInterface;
Chris@0 8 use Drupal\Core\Routing\RoutingEvents;
Chris@0 9 use Symfony\Component\EventDispatcher\Event;
Chris@0 10 use Symfony\Component\EventDispatcher\EventSubscriberInterface;
Chris@0 11
Chris@0 12 /**
Chris@0 13 * Rebuilds the default menu links and runs menu-specific code if necessary.
Chris@0 14 */
Chris@0 15 class MenuRouterRebuildSubscriber implements EventSubscriberInterface {
Chris@0 16
Chris@0 17 /**
Chris@0 18 * @var \Drupal\Core\Lock\LockBackendInterface
Chris@0 19 */
Chris@0 20 protected $lock;
Chris@0 21
Chris@0 22 /**
Chris@0 23 * The menu link plugin manager.
Chris@0 24 *
Chris@0 25 * @var \Drupal\Core\Menu\MenuLinkManagerInterface
Chris@0 26 */
Chris@0 27 protected $menuLinkManager;
Chris@0 28
Chris@0 29 /**
Chris@0 30 * Constructs the MenuRouterRebuildSubscriber object.
Chris@0 31 *
Chris@0 32 * @param \Drupal\Core\Lock\LockBackendInterface $lock
Chris@0 33 * The lock backend.
Chris@0 34 * @param \Drupal\Core\Menu\MenuLinkManagerInterface $menu_link_manager
Chris@0 35 * The menu link plugin manager.
Chris@0 36 */
Chris@0 37 public function __construct(LockBackendInterface $lock, MenuLinkManagerInterface $menu_link_manager) {
Chris@0 38 $this->lock = $lock;
Chris@0 39 $this->menuLinkManager = $menu_link_manager;
Chris@0 40 }
Chris@0 41
Chris@0 42 /**
Chris@0 43 * Rebuilds the menu links and deletes the local_task cache tag.
Chris@0 44 *
Chris@0 45 * @param \Symfony\Component\EventDispatcher\Event $event
Chris@0 46 * The event object.
Chris@0 47 */
Chris@0 48 public function onRouterRebuild(Event $event) {
Chris@0 49 $this->menuLinksRebuild();
Chris@0 50 Cache::invalidateTags(['local_task']);
Chris@0 51 }
Chris@0 52
Chris@0 53 /**
Chris@0 54 * Perform menu-specific rebuilding.
Chris@0 55 */
Chris@0 56 protected function menuLinksRebuild() {
Chris@0 57 if ($this->lock->acquire(__FUNCTION__)) {
Chris@0 58 $transaction = db_transaction();
Chris@0 59 try {
Chris@0 60 // Ensure the menu links are up to date.
Chris@0 61 $this->menuLinkManager->rebuild();
Chris@0 62 // Ignore any database replicas temporarily.
Chris@0 63 db_ignore_replica();
Chris@0 64 }
Chris@0 65 catch (\Exception $e) {
Chris@0 66 $transaction->rollBack();
Chris@0 67 watchdog_exception('menu', $e);
Chris@0 68 }
Chris@0 69
Chris@0 70 $this->lock->release(__FUNCTION__);
Chris@0 71 }
Chris@0 72 else {
Chris@0 73 // Wait for another request that is already doing this work.
Chris@0 74 // We choose to block here since otherwise the router item may not
Chris@0 75 // be available during routing resulting in a 404.
Chris@0 76 $this->lock->wait(__FUNCTION__);
Chris@0 77 }
Chris@0 78 }
Chris@0 79
Chris@0 80 /**
Chris@0 81 * {@inheritdoc}
Chris@0 82 */
Chris@0 83 public static function getSubscribedEvents() {
Chris@0 84 // Run after CachedRouteRebuildSubscriber.
Chris@0 85 $events[RoutingEvents::FINISHED][] = ['onRouterRebuild', 100];
Chris@0 86 return $events;
Chris@0 87 }
Chris@0 88
Chris@0 89 }