hn-8.x-1.x-dev/modules/hn_config/src/EventSubscriber/EventSubscriber.php
modules/hn_config/src/EventSubscriber/EventSubscriber.php
<?php
namespace Drupal\hn_config\EventSubscriber;
use Drupal\Core\Menu\MenuTreeParameters;
use Drupal\hn\Event\HnResponseEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
/**
* Class DefaultSubscriber.
*/
class EventSubscriber implements EventSubscriberInterface {
/**
* {@inheritdoc}
*/
public static function getSubscribedEvents() {
return [
HnResponseEvent::CREATED_CACHE_MISS => 'alterResponseData',
];
}
/**
* Alters the response data.
*
* @param \Drupal\hn\Event\HnResponseEvent $event
* The event that was dispatched.
*/
public function alterResponseData(HnResponseEvent $event) {
$responseData = $event->getResponseData();
$config = \Drupal::config('hn_config.settings');
foreach ($config->get('menus') as $menu_id) {
$responseData['data']['config__menus'][$menu_id] = $this->getMenuItemsById($menu_id);
}
foreach ($config->get('entities') as $config_id) {
$config = \Drupal::config($config_id);
$responseData['data']['config__entities'][$config_id] = $config->get();
}
$event->setResponseData($responseData);
}
/**
* Returns all menu items of a menu.
*
* @param string $menuName
* Menu id (like: main).
*
* @return array
* All menu items (nested).
*/
private function getMenuItemsById($menuName) {
// Get the menu Tree.
$menuTree = \Drupal::menuTree();
// Set the parameters.
$parameters = new MenuTreeParameters();
$parameters->onlyEnabledLinks();
// Load the tree based on this set of parameters.
$tree = $menuTree->load($menuName, $parameters);
// Transform the tree using the manipulators you want.
$manipulators = [
// Only show links that are accessible for the current user.
['callable' => 'menu.default_tree_manipulators:checkAccess'],
// Use the default sorting of menu links.
['callable' => 'menu.default_tree_manipulators:generateIndexAndSort'],
];
$tree = $menuTree->transform($tree, $manipulators);
// Finally, build a renderable array from the transformed tree.
$menu = $menuTree->build($tree);
if (empty($menu['#items'])) {
return [];
}
return $this->normalizeMenuItems($menu['#items']);
}
/**
* This normalizes menu items for the HN endpoint.
*
* @param array $items
* The menu items.
*
* @return array
* The normalized menu items.
*/
private function normalizeMenuItems(array $items) {
return array_map(function ($key, $item) {
/** @var \Drupal\Core\Url $url */
$url = $item['url'];
$item_return = [
'key' => $key,
'title' => $item['title'],
'url' => $url->toString(),
];
if (!empty($item['below'])) {
$item_return['below'] = $this->normalizeMenuItems($item['below']);
}
return $item_return;
}, array_keys($items), $items);
}
}
