menuLinkTree = $menu_link_tree; } /** * Returns the render array for a menu. * * @param string $menu_name * The name of the menu. * @param int $level * (optional) Initial menu level. * @param int $depth * (optional) Maximum number of menu levels to display. * @param bool $expand * (optional) Expand all menu links. * * @return array * A render array for the menu. * * @see \Drupal\system\Plugin\Block\SystemMenuBlock::build() */ public function build(string $menu_name, int $level = 1, int $depth = 0, bool $expand = FALSE): array { $parameters = $this->menuLinkTree->getCurrentRouteMenuTreeParameters($menu_name); // Adjust the menu tree parameters based on the block's configuration. $parameters->setMinDepth($level); // When the depth is configured to zero, there is no depth limit. When depth // is non-zero, it indicates the number of levels that must be displayed. // Hence this is a relative depth that we must convert to an actual // (absolute) depth, that may never exceed the maximum depth. if ($depth > 0) { $parameters->setMaxDepth(min($level + $depth - 1, $this->menuLinkTree->maxDepth())); } // If expandedParents is empty, the whole menu tree is built. if ($expand) { $parameters->expandedParents = []; } $tree = $this->menuLinkTree->load($menu_name, $parameters); $manipulators = [ ['callable' => 'menu.default_tree_manipulators:checkAccess'], ['callable' => 'menu.default_tree_manipulators:generateIndexAndSort'], ]; $tree = $this->menuLinkTree->transform($tree, $manipulators); return $this->menuLinkTree->build($tree); } }