<?php
namespace App\Security\Voter;
use App\Entity\Declarative;
use App\Service\HierarchyService;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Core\Authorization\Voter\Voter;
use Symfony\Component\Security\Core\User\UserInterface;
class DeclarativeVoter extends Voter
{
public const EDIT = 'PATCH_DECLARATIVE';
public const DELETE = 'DELETE_DECLARATIVE';
private $hierarchyService;
public function __construct(
HierarchyService $hierarchyService
)
{
$this->hierarchyService = $hierarchyService;
}
protected function supports(string $attribute, $subject): bool
{
// remplacez par votre logique
// https://symfony.com/doc/current/security/voters.html
return in_array($attribute, [self::EDIT,self::DELETE])
&& $subject instanceof \App\Entity\Declarative;
}
protected function voteOnAttribute(string $attribute, $declarative, TokenInterface $token): bool
{
$userConnected = $token->getUser();
// si l'utilisateur est anonyme, ne pas accorder l'accès
if (!$userConnected instanceof UserInterface) {
return false;
}
/** @var Declarative $declarative */
$seller = $declarative->getSeller();
if($seller == null){
return false;
}
// ... (vérifier les conditions et renvoyer true pour accorder l'autorisation) ...
switch ($attribute) {
case self::EDIT:
// logique pour déterminer si l'utilisateur peut modifier le declaratif
// return true or false
if($seller == $userConnected || $this->hierarchyService->isChild($userConnected, $seller)){
return true;
}
break;
case self::DELETE:
// logique pour déterminer si l'utilisateur peut modifier le declaratif
// return true or false
if($seller == $userConnected || $this->hierarchyService->isChild($userConnected, $seller)){
return true;
}
break;
}
return false;
}
}