src/Security/Voter/MessageVoter.php line 11

Open in your IDE?
  1. <?php
  2. namespace App\Security\Voter;
  3. use App\Entity\Message;
  4. use App\Entity\User;
  5. use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
  6. use Symfony\Component\Security\Core\Authorization\Voter\Voter;
  7. use Symfony\Component\Security\Core\Security;
  8. class MessageVoter extends Voter
  9. {
  10.     const VIEW   'view';
  11.     const ANSWER 'answer';
  12.     const DELETE 'delete';
  13.     private $security;
  14.     public function __construct(Security $security)
  15.     {
  16.         $this->security $security;
  17.     }
  18.     protected function supports($attribute$subject)
  19.     {
  20.         if (!in_array($attribute, [self::VIEWself::ANSWERself::DELETE])) {
  21.             return false;
  22.         }
  23.         if (!$subject instanceof Message) {
  24.             return false;
  25.         }
  26.         return true;
  27.     }
  28.     protected function voteOnAttribute($attribute$subjectTokenInterface $token)
  29.     {
  30.         $user $token->getUser();
  31.         if (!$user instanceof User) {
  32.             return false;
  33.         }
  34.         /** @var Message $message */
  35.         $message $subject;
  36.         switch ($attribute) {
  37.             case self::VIEW:
  38.                 return $this->canView($message$user$token);
  39.             case self::ANSWER:
  40.                 return $this->canAnswer($message$user$token);
  41.             case self::DELETE:
  42.                 return $this->canDelete($message$user$token);
  43.         }
  44.         throw new \LogicException('This code should not be reached!');
  45.     }
  46.     // [HP] @todo condition if message deleted ?
  47.     private function canView(Message $messageUser $userTokenInterface $token)
  48.     {
  49.         return $message->hasParticipant($user);
  50.     }
  51.     private function canAnswer(Message $messageUser $userTokenInterface $token)
  52.     {
  53.         return !$message->getSystem() && $message->hasParticipant($user);
  54.     }
  55.     private function canDelete(Message $messageUser $userTokenInterface $token)
  56.     {
  57.         return ($message->getSystem() && $message->hasParticipant($user)) ||
  58.             $this->security->isGranted(User::ROLE_SUPER_ADMIN);
  59.     }
  60. }