applyScope($queryBuilder, $queryNameGenerator, $resourceClass); } public function applyToItem( QueryBuilder $queryBuilder, QueryNameGeneratorInterface $queryNameGenerator, string $resourceClass, array $identifiers, ?Operation $operation = null, array $context = [], ): void { $this->applyScope($queryBuilder, $queryNameGenerator, $resourceClass); } /** * Applique le filtre IN sur les IDs de sites autorises si les conditions * d'application sont remplies. No-op sinon. */ private function applyScope( QueryBuilder $queryBuilder, QueryNameGeneratorInterface $queryNameGenerator, string $resourceClass, ): void { // 1) Cette extension cible uniquement la resource Site. if (Site::class !== $resourceClass) { return; } // 2) Admin ou user avec bypass explicite : visibilite globale. if ($this->security->isGranted('sites.bypass_scope')) { return; } // 3) Pas d'user authentifie -> no-op (API Platform gere le 401 en amont). $user = $this->security->getUser(); if (!$user instanceof User) { return; } $rootAlias = $queryBuilder->getRootAliases()[0]; // 4) User sans aucun site rattache -> aucun acces possible. $siteIds = $user->getSites()->map(fn (Site $s) => $s->getId())->toArray(); if (empty($siteIds)) { $queryBuilder->andWhere('1 = 0'); return; } // 5) Cas normal : restriction aux sites autorises de l'utilisateur. $param = $queryNameGenerator->generateParameterName('allowedSites'); $queryBuilder ->andWhere(sprintf('%s.id IN (:%s)', $rootAlias, $param)) ->setParameter($param, $siteIds) ; } }