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; } }