src/Security/InsuranceVoter.php line 10

Open in your IDE?
  1. <?php
  2. namespace App\Security;
  3. use App\Entity\Insurance;
  4. use App\Entity\User;
  5. use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
  6. use Symfony\Component\Security\Core\Authorization\Voter\Voter;
  7. class InsuranceVoter extends Voter
  8. {
  9.     const VIEW 'view';
  10.     const EDIT 'edit';
  11.     const DELETE 'delete';
  12.     protected function supports(string $attribute$subject): bool
  13.     {
  14.         // if the attribute isn't one we support, return false
  15.         if (!in_array($attribute, [self::VIEWself::EDITself::DELETE])) {
  16.             return false;
  17.         }
  18.         if (!$subject instanceof Insurance) {
  19.             return false;
  20.         }
  21.         return true;
  22.     }
  23.     protected function voteOnAttribute(string $attribute$subjectTokenInterface $token): bool
  24.     {
  25.         $user $token->getUser();
  26.         if (!$user instanceof User) {
  27.             // the user must be logged in; if not, deny access
  28.             return false;
  29.         }
  30.         /** @var Insurance $insurance */
  31.         $insurance $subject;
  32.         switch ($attribute) {
  33.             case self::VIEW:
  34.                 return $this->canView($insurance$user);
  35.             case self::EDIT:
  36.                 return $this->canEdit($insurance$user);
  37.             case self::DELETE:
  38.                 return $this->canDelete($insurance$user);
  39.         }
  40.         throw new \LogicException('This code should not be reached!');
  41.     }
  42.     //      * @Security("insurance.getUser().getId() == user.getId() or (user.getPartnerLead() == user.getPartnerLead().getId() and insurance.getUser().getId() == user.getPartnerLead().getId()) or (user.getPartner() == user.getPartner().getId() and insurance.getUser().getId() == user.getPartner().getId())")
  43.     private function canView(Insurance $insuranceUser $user): bool
  44.     {
  45.         return $insurance->getUser() === $user || ($user->getPartnerLead() && $insurance->getUser() === $user->getPartnerLead()) || ($user->getPartner() && $insurance->getUser() === $user->getPartner());
  46.     }
  47.     private function canEdit(Insurance $insuranceUser $user): bool
  48.     {
  49.         return null === $insurance->getId() || $this->canView($insurance$user);
  50.     }
  51.     private function canDelete(Insurance $insuranceUser $user): bool
  52.     {
  53.         return $insurance->getUser() === $user;
  54.     }
  55. }