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