src/Security/Voter/ForumVoter.php line 15

Open in your IDE?
  1. <?php
  2. namespace App\Security\Voter;
  3. use App\Entity\Forum;
  4. use App\Entity\ForumAccess;
  5. use App\Entity\ForumMessage;
  6. use App\Entity\User;
  7. use App\EntityManager\ForumAccessManager;
  8. use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
  9. use Symfony\Component\Security\Core\Authorization\AccessDecisionManagerInterface;
  10. use Symfony\Component\Security\Core\Authorization\Voter\Voter;
  11. use Symfony\Component\Security\Core\Security;
  12. class ForumVoter extends Voter
  13. {
  14.     const VIEW         'view';
  15.     const CREATE_TOPIC 'create_topic';
  16.     const MODERATE     'moderate';
  17.     protected $security;
  18.     protected $forumAccessManager;
  19.     protected $userForumAccess null;
  20.     protected $forumAccess     null;
  21.     public function __construct(Security $securityForumAccessManager $forumAccessManager)
  22.     {
  23.         $this->security           $security;
  24.         $this->forumAccessManager $forumAccessManager;
  25.     }
  26.     protected function supports($attribute$subject)
  27.     {
  28.         if (!in_array($attribute, [self::VIEWself::CREATE_TOPICself::MODERATE])) {
  29.             return false;
  30.         }
  31.         if (!$subject instanceof Forum && !$subject instanceof ForumMessage) {
  32.             return false;
  33.         }
  34.         return true;
  35.     }
  36.     protected function voteOnAttribute($attribute$subjectTokenInterface $token)
  37.     {
  38.         $user $token->getUser();
  39.         if (!$user instanceof User) {
  40.             $user null;
  41.         }
  42.         /** @var Forum $forum */
  43.         $forum $subject instanceof ForumMessage $subject->getForum() : $subject;
  44.         if (is_null($this->forumAccess)) {
  45.             $this->userForumAccess $this->forumAccessManager->getForumAccessForCurrentUser($forum);
  46.             $this->forumAccess     $this->forumAccessManager->getForumAccess($forum);
  47.         }
  48.         switch ($attribute) {
  49.             case self::VIEW:
  50.                 return $this->canView($forum$user$token);
  51.             case self::CREATE_TOPIC:
  52.                 return $this->canCreateTopic($forum$user$token);
  53.             case self::MODERATE:
  54.                 return $this->canModerate($forum$user$token);
  55.         }
  56.         throw new \LogicException('This code should not be reached!');
  57.     }
  58.     private function canView(Forum $forumUser $user nullTokenInterface $token null)
  59.     {
  60.         return (
  61.             ($this->forumAccess instanceof ForumAccess && $this->forumAccess->getListMessage()) ||
  62.             ($this->userForumAccess instanceof ForumAccess && $this->userForumAccess->getListMessage())
  63.         );
  64.     }
  65.     private function canCreateTopic(Forum $forumUser $user nullTokenInterface $token null)
  66.     {
  67.         return (
  68.             $user instanceof User &&
  69.             ($this->forumAccess instanceof ForumAccess && $this->forumAccess->getAddMessage()) ||
  70.             ($this->userForumAccess instanceof ForumAccess && $this->userForumAccess->getAddMessage())
  71.         );
  72.     }
  73.     private function canModerate(Forum $forumUser $user nullTokenInterface $token null)
  74.     {
  75.         return $user instanceof User &&
  76.             $this->userForumAccess instanceof ForumAccess &&
  77.             $this->userForumAccess->getModMessage();
  78.     }
  79. }