<?phpnamespace App\Doctrine;use App\Annotation\Exclusions;use App\Entity\Company;use App\Entity\User;use App\Repository\Model\IExclusionRepository;use Doctrine\Common\Annotations\AnnotationReader;use Doctrine\ORM\EntityManagerInterface;use Doctrine\ORM\Mapping\ClassMetadata;use Doctrine\ORM\Query\Filter\SQLFilter;use Psr\Log\LoggerInterface;use Symfony\Component\Serializer\NameConverter\CamelCaseToSnakeCaseNameConverter;class ExclusionsFilter extends SQLFilter{ /** * @var User */ private $user; /** * @var EntityManagerInterface */ private $em; /** * @var LoggerInterface */ private $logger; /** * @inheritDoc */ public function addFilterConstraint(ClassMetadata $targetEntity, $targetTableAlias): string { $result = ""; $reader = new AnnotationReader(); $annotation = $reader->getClassAnnotation($targetEntity->getReflectionClass(), Exclusions::class); if ($annotation instanceof Exclusions && $this->user instanceof User && $this->user->hasRole(User::ROLE_CLIENT)) { // $user = $this->em->getRepository(User::class)->find($this->user->getId()); $company = $this->user->getClient()->getCompany(); $repo = $this->em->getRepository($annotation->exclusionsClass); if ($repo instanceof IExclusionRepository && $company instanceof Company) { $nameConverter = new CamelCaseToSnakeCaseNameConverter(); $name = $nameConverter->normalize($targetEntity->getReflectionClass()->getShortName() . '_id'); $class = $nameConverter->normalize((new \ReflectionClass($annotation->exclusionsClass))->getShortName()); $result = "$targetTableAlias.id NOT IN((SELECT x0_.$name FROM $class AS x0_ WHERE x0_.company_id = {$company->getId()}))"; } } return $result; } /** * @return mixed */ public function getUser() { return $this->user; } /** * @param mixed $user * @return ExclusionsFilter */ public function setUser($user): self { $this->user = $user; return $this; } /** * @param EntityManagerInterface $em * @return $this */ public function setEntityManager(EntityManagerInterface $em): self { $this->em = $em; return $this; } /** * @param mixed $logger * @return ExclusionsFilter */ public function setLogger($logger): self { $this->logger = $logger; return $this; } /** * @return mixed */ public function getLogger() { return $this->logger; }}