src/Security/Voter/DirectionVoter.php line 11

  1. <?php
  2. namespace App\Security\Voter;
  3. use App\Entity\Admin\Parameter\Direction as ParameterDirection;
  4. use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
  5. use App\Entity\Direction;
  6. use Symfony\Component\Security\Core\Authorization\Voter\Voter;
  7. use Symfony\Component\Security\Core\User\UserInterface;
  8. class DirectionVoter extends Voter
  9. {
  10.     public const EDIT 'POST_EDIT';
  11.     public const VIEW 'POST_VIEW';
  12.     public const IS_DIRECTOR 'IS_DIRECTOR';
  13.     protected function supports(string $attributemixed $subject): bool
  14.     {
  15.         // Vérifie si l'attribut correspond à ceux gérés par ce voter
  16.         if (in_array($attribute, [self::EDITself::VIEW])) {
  17.             return $subject instanceof ParameterDirection;
  18.         }
  19.         return $attribute === self::IS_DIRECTOR;
  20.     }
  21.     protected function voteOnAttribute(string $attributemixed $subjectTokenInterface $token): bool
  22.     {
  23.         $user $token->getUser();
  24.         // Si l'utilisateur n'est pas connecté, il n'a aucun droit
  25.         if (!$user instanceof UserInterface) {
  26.             return false;
  27.         }
  28.         switch ($attribute) {
  29.             case self::EDIT:
  30.                 return $this->canEdit($user$subject);
  31.             case self::VIEW:
  32.                 return $this->canView($user$subject);
  33.             case self::IS_DIRECTOR:
  34.                 return $this->isDirector($user);
  35.         }
  36.         return false;
  37.     }
  38.     private function canEdit(UserInterface $userDirection $direction): bool
  39.     {
  40.         // Vérifie si l'utilisateur est le directeur de la direction donnée
  41.         return $direction->getDirector() === $user;
  42.     }
  43.     private function canView(UserInterface $userDirection $direction): bool
  44.     {
  45.         // Exemple simple : tout le monde peut voir
  46.         return true;
  47.     }
  48.     private function isDirector(UserInterface $user): bool
  49.     {
  50.         // Vérifie si l'utilisateur est directeur d'au moins une direction
  51.         return method_exists($user'getDirections') && !$user->getDirections()->isEmpty();
  52.     }
  53. }