src/Security/Voter/PostVoter.php line 13

  1. <?php
  2. declare(strict_types=1);
  3. namespace App\Security\Voter;
  4. use App\Entity\User\User;
  5. use App\Entity\Wiki\Post;
  6. use App\Helper\UserHelper;
  7. use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
  8. use Symfony\Component\Security\Core\Authorization\Voter\Voter;
  9. class PostVoter extends Voter
  10. {
  11.     const VIEW 'VIEW';
  12.     const DELETE 'DELETE';
  13.     const EDIT 'EDIT';
  14.     protected function supports(string $attributemixed $subject): bool
  15.     {
  16.         if (!\in_array($attribute, [self::VIEWself::DELETEself::EDIT])) {
  17.             return false;
  18.         }
  19.         if (!$subject instanceof Post) {
  20.             return false;
  21.         }
  22.         return true;
  23.     }
  24.     protected function voteOnAttribute(string $attribute$subjectTokenInterface $token): bool
  25.     {
  26.         $user $token->getUser();
  27.         if (!$user instanceof User) {
  28.             return false;
  29.         }
  30.         /** @var Post $post */
  31.         $post $subject;
  32.         return match ($attribute) {
  33.             self::VIEW => $this->canView($user$post),
  34.             self::DELETE => UserHelper::isAdmin($user),
  35.             self::EDIT => $this->canEdit($user$post),
  36.             default => throw new \LogicException('This code should not be reached!'),
  37.         };
  38.     }
  39.     private function canView(User $userPost $post): bool
  40.     {
  41.         if (UserHelper::isAdmin($user)) {
  42.             return true;
  43.         }
  44.         if (Post::STATUS__PUBLISHED === $post->getStatus()) {
  45.             return true;
  46.         }
  47.         if ($user->getId() === $post->author()->getId()) {
  48.             return true;
  49.         }
  50.         return false;
  51.     }
  52.     private function canEdit(User $userPost $post): bool
  53.     {
  54.         if (UserHelper::isAdmin($user)) {
  55.             return true;
  56.         }
  57.         if ($user->getId() === $post->author()->getId()) {
  58.             return true;
  59.         }
  60.         return false;
  61.     }
  62. }