src/Security/Voters/Shop/OrderVoter.php line 13

  1. <?php
  2. declare(strict_types=1);
  3. namespace App\Security\Voters\Shop;
  4. use App\Entity\Shop\Order;
  5. use App\Enums\Operation;
  6. use App\Enums\Roles;
  7. use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
  8. use Symfony\Component\Security\Core\Authorization\Voter\CacheableVoterInterface;
  9. class OrderVoter implements CacheableVoterInterface
  10. {
  11.     public function __construct(
  12.         private readonly \Symfony\Bundle\SecurityBundle\Security $security,
  13.     ) {
  14.     }
  15.     public function supportsAttribute(string $attribute): bool
  16.     {
  17.         return Operation::match($attribute);
  18.     }
  19.     public function supportsType(string $subjectType): bool
  20.     {
  21.         return Order::class === $subjectType;
  22.     }
  23.     public function vote(TokenInterface $tokenmixed $subject, array $attributes): int
  24.     {
  25.         return match ($attributes) {
  26.             [Operation::READ->value] => $this->checkRead($token$subject),
  27.             [Operation::CREATE->value] => $this->checkCreate(),
  28.             default => self::ACCESS_DENIED,
  29.         };
  30.     }
  31.     private function checkCreate(): int
  32.     {
  33.         if ($this->security->isGranted(Roles::ROLE_USER)) {
  34.             return self::ACCESS_GRANTED;
  35.         }
  36.         return self::ACCESS_DENIED;
  37.     }
  38.     private function checkRead(TokenInterface $tokenOrder $subject): int
  39.     {
  40.         if ($token->getUserIdentifier() === $subject->getBuyer()->getUserIdentifier()) {
  41.             return self::ACCESS_GRANTED;
  42.         }
  43.         return self::ACCESS_DENIED;
  44.     }
  45. }