src/Security/Voter/BeneficiaryVoter.php line 11

Open in your IDE?
  1. <?php
  2. namespace App\Security\Voter;
  3. use App\Entity\Beneficiary;
  4. use App\Entity\User;
  5. use LogicException;
  6. use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
  7. use Symfony\Component\Security\Core\Authorization\Voter\Voter;
  8. class BeneficiaryVoter extends Voter
  9. {
  10.     public const EDIT 'beneficiary-edit';
  11.     public const ADD_ASSOCIATED 'beneficiary-add-associated';
  12.     public const SHOW 'beneficiary-show';
  13.     /**
  14.      * @inheritDoc
  15.      */
  16.     protected function supports($attribute$subject): bool
  17.     {
  18.         // if the attribute isn't one we support, return false
  19.         if (!in_array($attribute, [self::EDITself::ADD_ASSOCIATEDself::SHOW])) {
  20.             return false;
  21.         }
  22.         // only vote on `Beneficiary` objects
  23.         if (!$subject instanceof Beneficiary) {
  24.             return false;
  25.         }
  26.         return true;
  27.     }
  28.     /**
  29.      * @inheritDoc
  30.      */
  31.     protected function voteOnAttribute($attribute$subjectTokenInterface $token): bool
  32.     {
  33.         $user $token->getUser();
  34.         if (!$user instanceof User) {
  35.             // the user must be logged in; if not, deny access
  36.             return false;
  37.         }
  38.         /** @var Beneficiary $beneficiary */
  39.         $beneficiary $subject;
  40.         switch ($attribute) {
  41.             case self::EDIT:
  42.                 return $this->canEdit($beneficiary$user);
  43.             case self::ADD_ASSOCIATED:
  44.                 return $this->canAddAssociated($beneficiary$user);
  45.             case self::SHOW:
  46.                 return $this->canShow($beneficiary$user);
  47.         }
  48.         throw new LogicException('This code should not be reached!');
  49.     }
  50.     /**
  51.      * @param Beneficiary $beneficiary
  52.      * @param User $user
  53.      * @return bool
  54.      */
  55.     private function canEdit(Beneficiary $beneficiaryUser $user): bool
  56.     {
  57.         return $this->canShow($beneficiary$user);
  58.     }
  59.     /**
  60.      * @param Beneficiary $beneficiary
  61.      * @param User $user
  62.      * @return bool
  63.      */
  64.     private function canAddAssociated(Beneficiary $beneficiaryUser $user): bool
  65.     {
  66.         $beneficiary->getCollective()->getProtectedPeople();
  67.         return ($this->canShow($beneficiary$user) &&
  68.             $beneficiary->getBeneficiaryRelationMode()->getIsDefault() &&
  69.             $beneficiary->getCollective()->allowAssociatedBeneficiaries()
  70.         );
  71.     }
  72.     /**
  73.      * @param Beneficiary $beneficiary
  74.      * @param User $user
  75.      * @return bool
  76.      */
  77.     private function canShow(Beneficiary $beneficiaryUser $user): bool
  78.     {
  79.         return ($user->hasRole('ROLE_ATCLIENTE') && $beneficiary->getIsActive());
  80.     }
  81. }