Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
| Total | |
0.00% |
0 / 1 |
|
33.33% |
2 / 6 |
CRAP | |
48.15% |
13 / 27 |
| MenuActiveTrail | |
0.00% |
0 / 1 |
|
33.33% |
2 / 6 |
27.87 | |
48.15% |
13 / 27 |
| __construct | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 4 |
|||
| getCid | |
0.00% |
0 / 1 |
2.03 | |
80.00% |
4 / 5 |
|||
| resolveCacheMiss | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 4 |
|||
| getActiveTrailIds | |
100.00% |
1 / 1 |
1 | |
100.00% |
1 / 1 |
|||
| doGetActiveTrailIds | |
0.00% |
0 / 1 |
12 | |
0.00% |
0 / 5 |
|||
| getActiveLink | |
100.00% |
1 / 1 |
3 | |
100.00% |
8 / 8 |
|||
| <?php | |
| /** | |
| * @file | |
| * Contains \Drupal\Core\Menu\MenuActiveTrail. | |
| */ | |
| namespace Drupal\Core\Menu; | |
| use Drupal\Core\Cache\CacheBackendInterface; | |
| use Drupal\Core\Cache\CacheCollector; | |
| use Drupal\Core\Lock\LockBackendInterface; | |
| use Drupal\Core\Routing\RouteMatchInterface; | |
| /** | |
| * Provides the default implementation of the active menu trail service. | |
| * | |
| * It uses the current route name and route parameters to compare with the ones | |
| * of the menu links. | |
| */ | |
| class MenuActiveTrail extends CacheCollector implements MenuActiveTrailInterface { | |
| /** | |
| * The menu link plugin manager. | |
| * | |
| * @var \Drupal\Core\Menu\MenuLinkManagerInterface | |
| */ | |
| protected $menuLinkManager; | |
| /** | |
| * The route match object for the current page. | |
| * | |
| * @var \Drupal\Core\Routing\RouteMatchInterface | |
| */ | |
| protected $routeMatch; | |
| /** | |
| * Constructs a \Drupal\Core\Menu\MenuActiveTrail object. | |
| * | |
| * @param \Drupal\Core\Menu\MenuLinkManagerInterface $menu_link_manager | |
| * The menu link plugin manager. | |
| * @param \Drupal\Core\Routing\RouteMatchInterface $route_match | |
| * A route match object for finding the active link. | |
| * @param \Drupal\Core\Cache\CacheBackendInterface $cache | |
| * The cache backend. | |
| * @param \Drupal\Core\Lock\LockBackendInterface $lock | |
| * The lock backend. | |
| */ | |
| public function __construct(MenuLinkManagerInterface $menu_link_manager, RouteMatchInterface $route_match, CacheBackendInterface $cache, LockBackendInterface $lock) { | |
| parent::__construct(NULL, $cache, $lock); | |
| $this->menuLinkManager = $menu_link_manager; | |
| $this->routeMatch = $route_match; | |
| } | |
| /** | |
| * {@inheritdoc} | |
| * | |
| * @see ::getActiveTrailIds() | |
| */ | |
| protected function getCid() { | |
| if (!isset($this->cid)) { | |
| $route_parameters = $this->routeMatch->getRawParameters()->all(); | |
| ksort($route_parameters); | |
| return 'active-trail:route:' . $this->routeMatch->getRouteName() . ':route_parameters:' . serialize($route_parameters); | |
| } | |
| return $this->cid; | |
| } | |
| /** | |
| * {@inheritdoc} | |
| * | |
| * @see ::getActiveTrailIds() | |
| */ | |
| protected function resolveCacheMiss($menu_name) { | |
| $this->storage[$menu_name] = $this->doGetActiveTrailIds($menu_name); | |
| $this->tags[] = 'config:system.menu.' . $menu_name; | |
| $this->persist($menu_name); | |
| return $this->storage[$menu_name]; | |
| } | |
| /** | |
| * {@inheritdoc} | |
| * | |
| * This implementation caches all active trail IDs per route match for *all* | |
| * menus whose active trails are calculated on that page. This ensures 1 cache | |
| * get for all active trails per page load, rather than N. | |
| * | |
| * It uses the cache collector pattern to do this. | |
| * | |
| * @see ::get() | |
| * @see \Drupal\Core\Cache\CacheCollectorInterface | |
| * @see \Drupal\Core\Cache\CacheCollector | |
| */ | |
| public function getActiveTrailIds($menu_name) { | |
| return $this->get($menu_name); | |
| } | |
| /** | |
| * Helper method for ::getActiveTrailIds(). | |
| */ | |
| protected function doGetActiveTrailIds($menu_name) { | |
| // Parent ids; used both as key and value to ensure uniqueness. | |
| // We always want all the top-level links with parent == ''. | |
| $active_trail = array('' => ''); | |
| // If a link in the given menu indeed matches the route, then use it to | |
| // complete the active trail. | |
| if ($active_link = $this->getActiveLink($menu_name)) { | |
| if ($parents = $this->menuLinkManager->getParentIds($active_link->getPluginId())) { | |
| $active_trail = $parents + $active_trail; | |
| } | |
| } | |
| return $active_trail; | |
| } | |
| /** | |
| * {@inheritdoc} | |
| */ | |
| public function getActiveLink($menu_name = NULL) { | |
| // Note: this is a very simple implementation. If you need more control | |
| // over the return value, such as matching a prioritized list of menu names, | |
| // you should substitute your own implementation for the 'menu.active_trail' | |
| // service in the container. | |
| // The menu links coming from the storage are already sorted by depth, | |
| // weight and ID. | |
| $found = NULL; | |
| $route_name = $this->routeMatch->getRouteName(); | |
| // On a default (not custom) 403 page the route name is NULL. On a custom | |
| // 403 page we will get the route name for that page, so we can consider | |
| // it a feature that a relevant menu tree may be displayed. | |
| if ($route_name) { | |
| $route_parameters = $this->routeMatch->getRawParameters()->all(); | |
| // Load links matching this route. | |
| $links = $this->menuLinkManager->loadLinksByRoute($route_name, $route_parameters, $menu_name); | |
| // Select the first matching link. | |
| if ($links) { | |
| $found = reset($links); | |
| } | |
| } | |
| return $found; | |
| } | |
| } |