src/Security/Voter/OccurrenceVoter.php line 13

Open in your IDE?
  1. <?php 
  2. // src/Security/Voter/OccurrenceVoter.php
  3. namespace App\Security\Voter;
  4. use App\Entity\Occurrence;
  5. use Menke\UserBundle\Entity\User;
  6. use App\Repository\CourseProviderRepository;
  7. use App\Repository\OccurrenceProviderRepository;
  8. use App\Repository\VenueProviderRepository;
  9. use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
  10. use Symfony\Component\Security\Core\Authorization\Voter\Voter;
  11. class OccurrenceVoter extends Voter
  12. {
  13.     public const VIEW 'OCCURRENCE_VIEW';
  14.     public const EDIT 'OCCURRENCE_EDIT';
  15.     public const CREATE 'OCCURRENCE_CREATE';
  16.     private $occRepo;
  17.     private $courseRepo;
  18.     private $venueRepo;
  19.     public function __construct(
  20.         OccurrenceProviderRepository $occRepo,
  21.         CourseProviderRepository $courseRepo,
  22.         VenueProviderRepository $venueRepo
  23.     ) {
  24.         $this->occRepo $occRepo;
  25.         $this->courseRepo $courseRepo;
  26.         $this->venueRepo $venueRepo;
  27.     }
  28.     protected function supports($attribute$subject): bool
  29.     {
  30.         if (\in_array($attribute, [self::VIEWself::EDIT]) && $subject instanceof Occurrence) {
  31.             return true;
  32.         }
  33.         if ($attribute === self::CREATE && ($subject === null || $subject instanceof \App\Entity\Course)) {
  34.             return true// CREATE wird mit Course-Kontext aufgerufen
  35.         }
  36.         return false;
  37.     }
  38.     protected function voteOnAttribute($attribute$subjectTokenInterface $token): bool
  39.     {
  40.         $user $token->getUser();
  41.         if (!$user instanceof User) {
  42.             return false;
  43.         }
  44.         if (!\in_array('ROLE_PROVIDER'$user->getRoles(), true) && !\in_array('ROLE_ADMIN'$user->getRoles(), true)) {
  45.             return false;
  46.         }
  47.         if (\in_array('ROLE_ADMIN'$user->getRoles(), true)) {
  48.             return true// Admin darf immer
  49.         }
  50.         $provider $user->getProvider();
  51.         if (!$provider) {
  52.             return false;
  53.         }
  54.         switch ($attribute) {
  55.             case self::CREATE:
  56.                 // subject ist der Course, zu dem die Occurrence angelegt werden soll
  57.                 /** @var \App\Entity\Course $course */
  58.                 $course $subject;
  59.                 return $this->courseRepo->existsFor($course->getId(), $provider->getId());
  60.             case self::VIEW:
  61.             case self::EDIT:
  62.                 /** @var Occurrence $occ */
  63.                 $occ $subject;
  64.                 // Direkt an Occurrence?
  65.                 if ($this->occRepo->existsFor($occ->getId(), $provider->getId())) return true;
  66.                 // Über Course?
  67.                 if ($occ->getCourse() && $this->courseRepo->existsFor($occ->getCourse()->getId(), $provider->getId())) return true;
  68.                 // Über Venue?
  69.                 if ($occ->getVenue() && $this->venueRepo->existsFor($occ->getVenue()->getId(), $provider->getId())) return true;
  70.                 return false;
  71.         }
  72.         return false;
  73.     }
  74. }