ServicesMenuResource.php in Services Menu 2.x
File
src/Plugin/rest/resource/ServicesMenuResource.php
View source
<?php
namespace Drupal\services_menu\Plugin\rest\resource;
use Drupal\rest\Plugin\ResourceBase;
use Drupal\rest\ResourceResponse;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Drupal\Core\Menu\MenuTreeParameters;
use Psr\Log\LoggerInterface;
use Drupal\Core\Menu\MenuLinkTreeInterface;
use Drupal\Core\Routing\UrlGeneratorInterface;
class ServicesMenuResource extends ResourceBase {
protected $menuTree;
protected $urlGenerator;
public function __construct(array $configuration, $plugin_id, $plugin_definition, array $serializer_formats, LoggerInterface $logger, MenuLinkTreeInterface $menuTree, UrlGeneratorInterface $urlGenerator) {
parent::__construct($configuration, $plugin_id, $plugin_definition, $serializer_formats, $logger);
$this->menuTree = $menuTree;
$this->urlGenerator = $urlGenerator;
}
public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
return new static($configuration, $plugin_id, $plugin_definition, $container
->getParameter('serializer.formats'), $container
->get('logger.factory')
->get('rest'), $container
->get('menu.link_tree'), $container
->get('url_generator'));
}
public function get($menu_name = NULL) {
$menu_tree = $this->menuTree;
$generator = $this->urlGenerator;
$menu = [];
$tree = $menu_tree
->load($menu_name, new MenuTreeParameters());
$manipulators = [
[
'callable' => 'menu.default_tree_manipulators:checkAccess',
],
[
'callable' => 'menu.default_tree_manipulators:generateIndexAndSort',
],
];
$tree = $menu_tree
->transform($tree, $manipulators);
foreach ($tree as $element) {
$link = $element->link;
$path = $generator
->getPathFromRoute($link
->getRouteName());
$menu[$link
->getRouteName()]['title'] = $link
->getTitle();
$menu[$link
->getRouteName()]['url'] = $path;
if ($element->subtree) {
$subtree = $menu_tree
->build($element->subtree);
foreach ($subtree['#items'] as $key => $value) {
$path = $generator
->getPathFromRoute($key);
$menu[$key]['title'] = $value['title'];
$menu[$key]['url'] = $path;
foreach ($subtree['#items'][$key]['below'] as $subkey => $subvalue) {
$path = $generator
->getPathFromRoute($subkey);
$menu[$key]['below'][$subkey]['title'] = $subvalue['title'];
$menu[$key]['below'][$subkey]['url'] = $path;
}
}
}
}
$response = new ResourceResponse($menu);
$response
->addCacheableDependency($menu);
return $response;
}
}