Mercurial > hg > isophonics-drupal-site
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; + } + +}