src/Security/Voter/HelpCategoryVoter.php line 12

Open in your IDE?
  1. <?php
  2. namespace MedBrief\MSR\Security\Voter;
  3. use MedBrief\MSR\Entity\HelpCategory;
  4. use Override;
  5. use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
  6. use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface;
  7. use Symfony\Component\Security\Core\Authorization\Voter\Voter;
  8. use Symfony\Component\Security\Core\User\UserInterface;
  9. class HelpCategoryVoter extends Voter
  10. {
  11. public const VIEW = 'VIEW';
  12. public function __construct(private readonly AuthorizationCheckerInterface $authorizationChecker)
  13. {
  14. }
  15. #[Override]
  16. protected function supports($attribute, $subject): bool
  17. {
  18. return $attribute == self::VIEW
  19. && $subject instanceof HelpCategory;
  20. }
  21. #[Override]
  22. protected function voteOnAttribute($attribute, $subject, TokenInterface $token): bool
  23. {
  24. $user = $token->getUser();
  25. // if the user is anonymous, do not grant access
  26. if (!$user instanceof UserInterface) {
  27. return false;
  28. }
  29. /** @var HelpCategory $HelpCategory */
  30. $HelpCategory = $subject;
  31. // ... (check conditions and return true to grant permission) ...
  32. return match ($attribute) {
  33. self::VIEW => $this->canView($HelpCategory),
  34. default => false,
  35. };
  36. }
  37. protected function canView(HelpCategory $HelpCategory): bool
  38. {
  39. // if the category is not active, return false as it is not necessary to check sections
  40. if ($HelpCategory->getActive() === false) {
  41. return false;
  42. }
  43. foreach ($HelpCategory->getSections() as $section) {
  44. if ($this->authorizationChecker->isGranted(HelpSectionVoter::VIEW, $section)) {
  45. return true;
  46. }
  47. }
  48. return false;
  49. }
  50. }