src/Security/CategoryVoter.php line 12

Open in your IDE?
  1. <?php
  2. namespace App\Security;
  3. use App\Entity\Category;
  4. use App\Entity\Security\AppUser;
  5. use App\Repository\CategoryRepository;
  6. use App\Repository\MalletteFileRepository;
  7. use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
  8. use Symfony\Component\Security\Core\Authorization\Voter\Voter;
  9. class CategoryVoter extends Voter
  10. {
  11.     public const VIEW 'view';
  12.     public const VIEW_MENU 'view_menu';
  13.     public function __construct(
  14.         private MalletteFileRepository $malletteFileRepository,
  15.         private CategoryRepository $categoryRepository,
  16.     ) {
  17.     }
  18.     protected function supports(string $attribute$subject): bool
  19.     {
  20.         if (!in_array($attribute, [self::VIEWself::VIEW_MENU])) {
  21.             return false;
  22.         }
  23.         return $subject instanceof Category;
  24.     }
  25.     /**
  26.      * @param Category $subject
  27.      */
  28.     protected function voteOnAttribute(string $attribute$subjectTokenInterface $token): bool
  29.     {
  30.         if (!in_array($attribute, [self::VIEWself::VIEW_MENU])) {
  31.             return false;
  32.         }
  33.         $user $token->getUser();
  34.         // the user must be logged in; if not, deny access
  35.         if (!$user instanceof AppUser) {
  36.             return false;
  37.         }
  38.         $groups $user->getClient()->getGroups();
  39.         $malletteFiles $this->malletteFileRepository->findByCategoryAccess($groups$user$subject);
  40.         $categories $this->categoryRepository->findByGroupsAndMalletteFiles($groups$malletteFiles);
  41.         if (in_array($subject$categories)) {
  42.             return true;
  43.         }
  44.         if ($attribute == self::VIEW_MENU) {
  45.             // Allow to show in the menu any category for which we can access a child
  46.             foreach ($subject->getSubCategories() as $subCategory) {
  47.                 if ($this->voteOnAttribute($attribute$subCategory$token)) {
  48.                     return true;
  49.                 }
  50.             }
  51.         }
  52.         return false;
  53.     }
  54. }