eventDispatcher = $dispatcher; $this->tokenStorage = $storage; } /** * @return array */ public static function getSubscribedEvents(): array { return [ SidebarMenuEvent::class => ['onSetupNavbar', 100], ]; } /** * Generate the main menu. * * @param SidebarMenuEvent $event */ public function onSetupNavbar(SidebarMenuEvent $event) { $request = $event->getRequest(); $event->addItem( new MenuItemModel('dashboard', 'menu.homepage', 'dashboard', [], 'fas fa-tachometer-alt') ); $menuEvent = new ConfigureMainMenuEvent( $request, $event, new MenuItemModel('admin', 'menu.admin', ''), new MenuItemModel('system', 'menu.system', '') ); // error pages don't have a user and will fail when is_granted() is called if (null !== $this->tokenStorage->getToken()) { $this->eventDispatcher->dispatch($menuEvent); } if ($menuEvent->getAdminMenu()->hasChildren()) { $event->addItem(new MenuItemModel('admin', 'menu.admin', '')); foreach ($menuEvent->getAdminMenu()->getChildren() as $child) { $event->addItem($child); } } if ($menuEvent->getSystemMenu()->hasChildren()) { $event->addItem(new MenuItemModel('system', 'menu.system', '')); foreach ($menuEvent->getSystemMenu()->getChildren() as $child) { $event->addItem($child); } } $this->activateByRoute( $event->getRequest()->get('_route'), $event->getItems() ); } /** * @param string $route * @param MenuItemInterface[] $items */ protected function activateByRoute($route, $items) { foreach ($items as $item) { if ($item->hasChildren()) { $this->activateByRoute($route, $item->getChildren()); } else { if ($item->getRoute() == $route) { $item->setIsActive(true); continue; } if ($item instanceof KimaiMenuItemModel) { if ($item->isChildRoute($route)) { $item->setIsActive(true); continue; } } } } } }