src/EventSubscriber/MenuBuilderSubscriber.php line 65

Open in your IDE?
  1. <?php
  2. namespace App\EventSubscriber;
  3. use App\Entity\Pages;
  4. use App\Entity\User;
  5. use App\Repository\PagesRepository;
  6. use App\Repository\UserRepository;
  7. use App\Service\UserHelper;
  8. use KevinPapst\AdminLTEBundle\Event\SidebarMenuEvent;
  9. use KevinPapst\AdminLTEBundle\Model\MenuItemInterface;
  10. use KevinPapst\AdminLTEBundle\Model\MenuItemModel;
  11. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  12. use Symfony\Component\Security\Core\Security;
  13. use Symfony\Contracts\Translation\TranslatorInterface;
  14. class MenuBuilderSubscriber implements EventSubscriberInterface
  15. {
  16.     
  17.     /**
  18.      * @var TranslatorInterface
  19.      */
  20.     private $translator;
  21.     /**
  22.      * @var UserRepository
  23.      */
  24.     private $userRepository;
  25.     /**
  26.      * @var array
  27.      */
  28.     private $routeMapping;
  29.     /**
  30.      * @var PagesRepository
  31.      */
  32.     private $pagesRepository;
  33.     /**
  34.      * @var Security
  35.      */
  36.     private $security;
  37.     /**
  38.      * @var UserHelper
  39.      */
  40.     private $userHelper;
  41.     public function __construct(TranslatorInterface $translatorUserRepository $userRepositoryPagesRepository $pagesRepositorySecurity $securityUserHelper $userHelper)
  42.     {
  43.         $this->translator $translator;
  44.         $this->userRepository $userRepository;
  45.         
  46.         //$this->initRoutesMapping();
  47.         $this->pagesRepository $pagesRepository;
  48.         $this->security $security;
  49.         $this->userHelper $userHelper;
  50.     }
  51.     
  52.     public static function getSubscribedEvents(): array
  53.     {
  54.         return [
  55.             SidebarMenuEvent::class => ['onSetupMenu'100],
  56.         ];
  57.     }
  58.     
  59.     public function onSetupMenu(SidebarMenuEvent $event)
  60.     {
  61.         /**
  62.          * @var $user User
  63.          */
  64.         $user $this->security->getUser();
  65.         $role $this->userHelper->getRoleId($user);
  66.         $menu $this->pagesRepository->findForRole(null$role);
  67.         foreach ($menu as $m) {
  68.             /** @var Pages $m */
  69.             $itemParent = new MenuItemModel($m->getId().'-'.$m->getPath(), $m->getLabel(), $m->getPath(), $m->getArguments() ? unserialize($m->getArguments()) : [], $m->getIcone());
  70.             // Les enfants
  71.             $enfants $this->pagesRepository->findForRole($m->getId(), $role);
  72.             foreach ($enfants as $enfant) {
  73.                 $itemEnfant = new MenuItemModel($enfant->getPath(), $enfant->getLabel(), $enfant->getPath(), $enfant->getArguments() ? unserialize($enfant->getArguments()) : [], $enfant->getIcone());
  74.                 $itemParent
  75.                     ->addChild($itemEnfant);
  76.                 $sousEnfants $this->pagesRepository->findForRole($enfant->getId(), $role);
  77.                 foreach ($sousEnfants as $sousEnfant) {
  78.                     $itemEnfant
  79.                         ->addChild(
  80.                             new MenuItemModel($sousEnfant->getPath(), $sousEnfant->getLabel(), $sousEnfant->getPath(), $sousEnfant->getArguments() ? unserialize($sousEnfant->getArguments()) : [], $sousEnfant->getIcone())
  81.                         );
  82.                 }
  83.             }
  84.             $event->addItem($itemParent);
  85.         }
  86.         
  87.         $this->activateByRoute(
  88.             $event->getRequest()->get('_route'),
  89.             $event->getItems()
  90.         );
  91.     }
  92.     
  93.     /**
  94.      * @param string $route
  95.      * @param MenuItemInterface[] $items
  96.      */
  97.     protected function activateByRoute($route$items)
  98.     {
  99.         foreach ($items as $item) {
  100.             $itemRoute $item->getRoute();
  101.             // Recherche dans les enfants
  102.             if ($item->hasChildren()) {
  103.                 $this->activateByRoute($route$item->getChildren());
  104.             }
  105.             // Route exacte
  106.             elseif ($itemRoute == $route) {
  107.                 $item->setIsActive(true);
  108.             }
  109.             // Recherche dans le mapping (arbre basique des routes)
  110.             elseif (isset($this->routeMapping[$itemRoute]) && in_array($route$this->routeMapping[$itemRoute])) {
  111.                 $item->setIsActive(true);
  112.             }
  113.         }
  114.     }
  115. }