Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
Total | |
0.00% |
0 / 1 |
|
0.00% |
0 / 4 |
CRAP | |
0.00% |
0 / 25 |
MenuRouterRebuildSubscriber | |
0.00% |
0 / 1 |
|
0.00% |
0 / 4 |
42 | |
0.00% |
0 / 25 |
__construct | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 3 |
|||
onRouterRebuild | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 3 |
|||
menuLinksRebuild | |
0.00% |
0 / 1 |
12 | |
0.00% |
0 / 16 |
|||
getSubscribedEvents | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 3 |
<?php | |
/** | |
* @file | |
* Contains \Drupal\Core\EventSubscriber\MenuRouterRebuildSubscriber. | |
*/ | |
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 $menuLinkManager | |
*/ | |
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(array('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} | |
*/ | |
static function getSubscribedEvents() { | |
// Run after CachedRouteRebuildSubscriber. | |
$events[RoutingEvents::FINISHED][] = array('onRouterRebuild', 100); | |
return $events; | |
} | |
} |