<?php
declare(strict_types=1);
namespace App\Security\Voter;
use App\Entity\Program\Program;
use App\Entity\User\AppUser;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Core\Authorization\Voter\Voter;
use Symfony\Component\Security\Core\User\UserInterface;
class ProgramVoter extends Voter
{
const CAN_VIEW = 'CAN_VIEW';
protected function supports(string $attribute, $subject)
{
return $attribute == self::CAN_VIEW && $subject instanceof Program;
}
protected function voteOnAttribute(string $attribute, $subject, TokenInterface $token)
{
$user = $token->getUser();
if (!$user instanceof AppUser) {
return $subject->getState() !== Program::STATE_DRAFT;
}
switch ($attribute) {
case self::CAN_VIEW:
return $this->canView($user, $subject);
}
}
private function canView(UserInterface $user, Program $program): bool
{
return $program->getState() !== Program::STATE_DRAFT;
}
}