<?php
namespace App\Security;
use App\Entity\FcmFoodSisetuGroupSisetu;
use App\Entity\SfGuardUser;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\Query\Expr\Select;
use Doctrine\Persistence\ManagerRegistry;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Core\Authorization\Voter\Voter;
use Symfony\Component\Security\Core\Security;
use function PHPUnit\Framework\isNull;
/**
* 施設IDがユーザーの対象の施設IDじゃなければエラー
*
* <code>
* $this->isGranted("fc.user_sisetu", $request->get('sisetu_id') )
* </code>
*
*/
class FcSisetuVoter extends Voter
{
private $security;
private $entityManager;
private $request;
public function __construct(Security $security, EntityManagerInterface $entityManager, RequestStack $request)
{
$this->security = $security;
$this->entityManager = $entityManager;
$this->request = $request->getCurrentRequest();
}
/**
* gアトリビュートがfc.user_sisetuのものが対象
*
*/
protected function supports(string $attribute, $subject)
{
return $attribute === "fc.user_sisetu";
}
/**
* チェック処理
*
* @param string $attribute
* @param int $sisetu_id 施設ID
*/
protected function voteOnAttribute(string $attribute, $sisetu_id, TokenInterface $token): bool
{
$user = $token->getUser();
/** @var SfGuardUser $user */
//TODO 対象施設以外はfalse
$result = $this->entityManager->createQueryBuilder()
->select('fsgs')
->from(FcmFoodSisetuGroupSisetu::class, 'fsgs')
->where('fsgs.foodSisetuGroup in (:fsg_id) and fsgs.foodSisetu = :fs_id')
->setParameters(['fsg_id' => $user->getFoodSisetuGroupIds(), 'fs_id' => $sisetu_id])
->getQuery()->getResult();
if (!$result || count($result) == 0) {
return false;
}
return true;
}
}