vendor/sylius/rbac-plugin/src/Access/Menu/AdminMenuAccessListener.php line 37

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace Sylius\RbacPlugin\Access\Menu;
  4. use Sylius\Bundle\UiBundle\Menu\Event\MenuBuilderEvent;
  5. use Sylius\Component\Core\Model\AdminUserInterface;
  6. use Sylius\RbacPlugin\Access\Checker\AdministratorAccessCheckerInterface;
  7. use Sylius\RbacPlugin\Access\Model\AccessRequest;
  8. use Sylius\RbacPlugin\Access\Model\OperationType;
  9. use Sylius\RbacPlugin\Access\Model\Section;
  10. use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
  11. use Webmozart\Assert\Assert;
  12. final class AdminMenuAccessListener
  13. {
  14.     /** @var TokenStorageInterface */
  15.     private $tokenStorage;
  16.     /** @var AdministratorAccessCheckerInterface */
  17.     private $accessChecker;
  18.     /** @var array */
  19.     private $configuration;
  20.     public function __construct(
  21.         TokenStorageInterface $tokenStorage,
  22.         AdministratorAccessCheckerInterface $accessChecker,
  23.         array $configuration
  24.     ) {
  25.         $this->tokenStorage $tokenStorage;
  26.         $this->accessChecker $accessChecker;
  27.         $this->configuration $configuration;
  28.     }
  29.     public function removeInaccessibleAdminMenuParts(MenuBuilderEvent $event): void
  30.     {
  31.         $token $this->tokenStorage->getToken();
  32.         Assert::notNull($token'There is no logged in user');
  33.         /** @var AdminUserInterface $adminUser */
  34.         $adminUser $token->getUser();
  35.         Assert::isInstanceOf($adminUserAdminUserInterface::class, 'Logged in user should be an administrator');
  36.         $menu $event->getMenu();
  37.         if ($this->hasAdminNoAccessToSection($adminUserSection::catalog())) {
  38.             $menu->removeChild('catalog');
  39.         }
  40.         if ($this->hasAdminNoAccessToSection($adminUserSection::configuration())) {
  41.             $menu->removeChild('configuration');
  42.         }
  43.         if ($this->hasAdminNoAccessToSection($adminUserSection::customers())) {
  44.             $menu->removeChild('customers');
  45.         }
  46.         if ($this->hasAdminNoAccessToSection($adminUserSection::marketing())) {
  47.             $menu->removeChild('marketing');
  48.         }
  49.         if ($this->hasAdminNoAccessToSection($adminUserSection::sales())) {
  50.             $menu->removeChild('sales');
  51.         }
  52.         /** @var string $customSection */
  53.         foreach (array_keys($this->configuration['custom']) as $customSection) {
  54.             if ($this->hasAdminNoAccessToSection($adminUserSection::ofType($customSection))) {
  55.                 $menu->removeChild($customSection);
  56.             }
  57.         }
  58.     }
  59.     private function hasAdminNoAccessToSection(AdminUserInterface $adminUserSection $section): bool
  60.     {
  61.         return !$this->accessChecker->canAccessSection(
  62.             $adminUser,
  63.             new AccessRequest($sectionOperationType::read())
  64.         );
  65.     }
  66. }