src/Security/BFFestivalVoter.php line 11

Open in your IDE?
  1. <?php
  2. namespace App\Security;
  3. use App\Entity\BFFestival;
  4. use App\Entity\BFUser;
  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 BFFestivalVoter extends Voter
  9. {
  10.     private $security;
  11.     // these strings are just invented: you can use anything
  12.     const EDIT 'edit';
  13.     const EDITNOTSUPER 'editnotsuper';
  14.     const DELETE 'delete';
  15.     const PAY 'pay';
  16.     
  17.     public function __construct(Security $security)
  18.     {
  19.         $this->security $security;
  20.     }
  21.     protected function supports($attribute$subject)
  22.     {
  23.         // if the attribute isn't one we support, return false
  24.         if (!in_array($attribute, [self::EDITself::DELETEself::EDITNOTSUPER])) {
  25.             return false;
  26.         }
  27.         // only vote on `BFFestival` objects
  28.         if (!$subject instanceof BFFestival) {
  29.             return false;
  30.         }
  31.         return true;
  32.     }
  33.     protected function voteOnAttribute($attribute$subjectTokenInterface $token)
  34.     {
  35.         if($attribute!=self::EDITNOTSUPER && $this->security->isGranted('ROLE_SUPER_ADMIN'))
  36.         {
  37.             return true;
  38.         }
  39.         
  40.         $user $token->getUser();
  41.         
  42.         if (!$user instanceof BFUser) {
  43.             // the user must be logged in; if not, deny access
  44.             return false;
  45.         }
  46.     
  47.         // you know $subject is a BFFestival object, thanks to `supports()`
  48.         /** @var Post $post */
  49.         $bffestival $subject;
  50.         switch ($attribute) {
  51.             case self::EDIT:
  52.                 return $this->canEdit($bffestival$user);
  53.             case self::EDITNOTSUPER:
  54.                 return $this->canEdit($bffestival$user);
  55.             case self::DELETE:
  56.                 return $this->canDelete($bffestival$user);
  57.         }
  58.         throw new \LogicException('This code should not be reached!');
  59.     }
  60.     private function canEdit(BFFestival $bffestivalBFUser $user)
  61.     {
  62.         // if they can edit, they can view
  63.         if ($this->canDelete($bffestival$user)) {
  64.             return true;
  65.         }
  66.         
  67.         return $bffestival->getAdministrators()->contains($user);
  68.     }
  69.     private function canDelete(BFFestival $bffestivalBFUser $user)
  70.     {
  71.         return $user==$bffestival->getOwner();
  72.     }
  73. }
  74. ?>