<?php
namespace App\Security;
use App\Entity\Main\Page;
use App\Model\User\Entity\User\User;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Core\Authorization\Voter\Voter;
class PageVoter extends Voter
{
const VISIBLE = 'visible';
const WRITABLE = 'writable';
const DELETED = 'deleted';
private $requestStack;
private $em;
public function __construct(RequestStack $requestStack, EntityManagerInterface $em)
{
$this->requestStack = $requestStack;
$this->em = $em;
}
protected function supports($attribute, $subject)
{
if ($subject instanceof Page && $attribute == self::VISIBLE || $attribute == self::WRITABLE || $attribute == self::DELETED) {
return true;
}
return false;
}
protected function voteOnAttribute($attribute, $subject, TokenInterface $token)
{
$user = $token->getUser();
if (!$user instanceof User) {
return false;
}
/** @var $subject Page */
foreach ($subject->getPageAccesses() as $pageAccess) {
if ($pageAccess->getPage()->getId() == $subject->getId() && $pageAccess->getRole()->getId() == $user->getRoleDb()->getId()) {
if ($attribute == self::VISIBLE && $pageAccess->getVisible() == 1) {
return true;
}
if ($attribute == self::WRITABLE && $pageAccess->getWritable() == 1) {
return true;
}
if ($attribute == self::DELETED && $pageAccess->getDeleted() == 1) {
return true;
}
}
}
return false;
}
}