<?php
namespace App\Voter;
use App\Entity\Child;
use App\Entity\Referral;
use App\Entity\ReferralDocument;
use App\Entity\User;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Core\Authorization\Voter\Voter;
use App\Entity\Address;
use App\Entity\Adult;
use App\Entity\PhoneNumber;
use Psr\Log\LoggerInterface;
class IsOwnerVoter extends Voter
{
const ATTRIBUTE = "IS_OWNER";
private $logger;
public function __construct(LoggerInterface $logger)
{
$this->logger = $logger;
}
public function supports($attribute, $object)
{
$this->logger->debug('***** Logger IsOwnerVoter entering supports, returning: ' . ($attribute == self::ATTRIBUTE && $this->getUserForObject($object) != null) ? 'true' : 'false');
return $attribute == self::ATTRIBUTE && $this->getUserForObject($object) != null;
}
protected function voteOnAttribute($attribute, $object, TokenInterface $token)
{
$this->logger->debug('***** Logger IsOwnerVoter entering voteOnAttribute');
$user = $token->getUser();
if (! ($user instanceof User)) {
$this->logger->debug('***** Logger IsOwnerVoter has no User from token, returning false');
return false;
}
$objectUser = $this->getUserForObject($object);
if (! $objectUser) {
$this->logger->debug('***** Logger IsOwnerVoter has no creating user for object, returning false');
return false;
}
$this->logger->debug('***** Logger IsOwnerVoter returning end result: ' . ($user == $objectUser ? 'true' : 'false'));
return $user == $objectUser;
}
protected function getUserForObject($object)
{
$this->logger->debug(' ***** Logger IsOwnerVoter entering getUserForObject');
if(is_array($object)){
//handle case when result contains both entity and scalar values
$object = $object[0];
$this->logger->debug(' ***** IsOwnerVoter Object is array');
}
$this->logger->debug(" ***** IsOwnerVoter class of object: " . get_class($object));
switch (get_class($object)) {
case Address::class:
case Adult::class:
case Child::class:
case PhoneNumber::class:
case Referral::class:
case ReferralDocument::class:
$this->logger->debug(' ***** IsOwnerVoter Class recognized as having CreatedBy ');
return $object->getCreatedBy();
case User::class:
$this->logger->debug(' ***** IsOwnerVoter Class is User');
return $object;
}
$this->logger->debug(' ***** IsOwnerVoter Class not found in voter');
return null;
}
}